1. 程式人生 > >redis+lua實現分散式令牌桶限流器

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