-- 业务标志 local businessTag=KEY[1] -- 限流数量 local limitDefault=tonumber(KEY[2] or 100) -- 限流标志 local limitOnOffTag=KEY[3] -- 限流开关 默认是 开 local limitOnOff=tonumber(redis.call("get",limitOnOffTag..":REQ_LIMIT_ON_OFF") or 0) if(limitOnOff>0){ return 1 } -- 如果没有获取到系统配置的限流数量就获取传入的默认限流数量 local limit = tonumber(redis.call("get",limitOnOffTag..":req_limit") or limitDefault)) -- 当前时间窗口内访问次数统计缓存KEY local key = businessTag..":counter:"..limitOnOffTag -- 获取当前时间范围内已访问次数 local current=tonumber(redis.call("get",key) or 0)); -- 设置统计时间范围 local windowTimeOutSetting=tonumber(redis.call("get",limitOnOffTag..":request_window_timeout") or 1) -- 如果历史还没有设置访问就设置一个key if(current<1){ redis.call("set",key,0) redis.call("expire",key,windowTimeOutSetting) current=0; } -- 当前时间范围内访问次数已经大于限流 则返回0 if(current+1>limitDefault) then return 0 else -- 当前时间范围内访问次数处于限流范围内 则返回已访问次数 redis.call("INCRBY", key ,"1") return (current+1) end