redis+lua實現分佈式令牌桶限流器

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的值統計每秒的真實訪問量大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章