vlambda博客
学习文章列表

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 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 的区别




我 一 直 不 知 道

喜 为 何 物

欢 有 何 由

你 的 出 现 给 了 我 答 案


来点开心的






武汉大学三行情书大赛冠军作品



螃蟹在剥我的壳

笔记本在写我

漫天的我落在枫叶上雪花上

而你在想我


螃蟹不可能在剥我的壳

笔记本不可能在写我

我不可能落在枫叶上雪花上

而你不可能在想我


是我在剥螃蟹壳

是我在写笔记本

是枫叶和雪花落在我的身上

是我在想你


除非世界颠倒你才会爱上我