redis+lua实现分布式令牌桶限流器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011411993/article/details/81546385

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的值统计每秒的真实访问量大小。

猜你喜欢

转载自blog.csdn.net/u011411993/article/details/81546385