算法亮点
- 滑动窗口
- 是否校验连续请求的最小间隔时间
- 失败请求是否加入窗口
流程图
![fgrapp](https://img-blog.csdnimg.cn/img_convert/780c90cfc5be766cf6e56f82fdfd055b.jpeg)
代码实现
Lua脚本
local zSetName = KEYS[1]
local uuid = KEYS[2]
local now = tonumber(KEYS[3])
local interval = tonumber(ARGV[1])
local maxInInterval = tonumber(ARGV[2])
local minDifference = tonumber(ARGV[3])
local addNewTimestamp = ARGV[4]
redis.call('ZREMRANGEBYSCORE', zSetName, 0, now - interval)
local count = redis.call('ZCARD', zSetName)
if count >= maxInInterval then
if addNewTimestamp == 'true' then
redis.call('ZADD', zSetName, now, uuid)
end
redis.call('EXPIRE', zSetName, math.ceil(interval/1000))
return -1
end
if (minDifference and count > 0