“人生没有白走的路,每一步都算数。”
使用 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 elseredis.call("INCR", key, "1")redis.call("expire", key, "3")return current+1end
02
—
注意点
- redis scriptLoad () 将脚本加载到 redis 缓存中 并且永久保存,然后返回一个 sha1 。
- evalsha (sha1 keys argv) 执行脚本。
- flush 删除脚本
注意:一般执行采用这样执行,将 lua 脚本加载到redis ,但是之后就不需要记载了。直接丢参数上去执行就好了。lua 脚本一定要注意 string 和 number 的区别
我 一 直 不 知 道
喜 为 何 物
欢 有 何 由
你 的 出 现 给 了 我 答 案
来点开心的
武汉大学三行情书大赛冠军作品

螃蟹在剥我的壳
笔记本在写我
漫天的我落在枫叶上雪花上
而你在想我
螃蟹不可能在剥我的壳
笔记本不可能在写我
我不可能落在枫叶上雪花上
而你不可能在想我
是我在剥螃蟹壳
是我在写笔记本
是枫叶和雪花落在我的身上
是我在想你
除非世界颠倒你才会爱上我