redis+lua實現分散式令牌桶限流器
阿新 • • 發佈:2019-02-17
redis+lua分散式令牌桶限流器
使用redis執行lua指令碼,返回結果為0表示被限流,為1表示正常訪問。lua指令碼傳入的KEYS[1]為redis中配置限流器qps的map的key,KEYS[2]為限流器的key,KEY[3]為秒級時間戳;傳入的ARGV[1]為請求的token數量,ARGV[2]為每秒使用的限流的key的過期時間。
local key=KEYS[2]..':'..KEYS[3]
local permit=tonumber(ARGV[1])
local expire=tonumber(ARGV[2])
local limit=tonumber(redis.call('hget' ,KEYS[1],KEYS[2]))
local count=tonumber(redis.call('incrby',key,permit))
if count>limit then
redis.call('expire',key,expire)
return 0
end
return 1
有一個問題是即使被限流了,count的值仍然一直在incrby增加,不過也無所謂,而且還可以通過count的值統計每秒的真實訪問量大小。