Redis + LUA 脚本实现分布式限流
“人生没有白走的路,每一步都算数。”
使用 Redis + lua 脚本实现分布式限流, lua 可以保证操作多个 key 执行的原子性,
注意:请求量很大的话,建议使用 Nginx + Open Resty 实现。
01
—
lua 脚本
keys = 时间戳 秒级别的。
String redisKey = "limit_" + new Date().getTime() / 1000
argv = limit 限流的次数,比如 key 一秒 limit 10 一秒钟 10 次 请求,超过就会被限制。
//lua 脚本
local key = KEYS[1]
local limit = ARGV[1]
local current = tonumber(redis.call('get', key) or "0" )
if current + 1 > limit then return 0
else
redis.call("INCR", key, "1")
redis.call("expire", key, "3")
return current+1
end
02
—
注意点
redis scriptLoad () 将脚本加载到 redis 缓存中 并且永久保存,然后返回一个 sha1 。
evalsha (sha1 keys argv) 执行脚本。
flush 删除脚本
注意:一般执行采用这样执行,将 lua 脚本加载到redis ,但是之后就不需要记载了。直接丢参数上去执行就好了。lua 脚本一定要注意 string 和 number 的区别
我 一 直 不 知 道
喜 为 何 物
欢 有 何 由
你 的 出 现 给 了 我 答 案
来点开心的
武汉大学三行情书大赛冠军作品
螃蟹在剥我的壳
笔记本在写我
漫天的我落在枫叶上雪花上
而你在想我
螃蟹不可能在剥我的壳
笔记本不可能在写我
我不可能落在枫叶上雪花上
而你不可能在想我
是我在剥螃蟹壳
是我在写笔记本
是枫叶和雪花落在我的身上
是我在想你
除非世界颠倒你才会爱上我