天天看點

腳本lua_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 的差別

我 一 直 不 知 道

喜 為 何 物

歡 有 何 由

你 的 出 現 給 了 我 答 案

來點開心的

武漢大學三行情書大賽冠軍作品

腳本lua_Redis + LUA 腳本實作分布式限流

螃蟹在剝我的殼

筆記本在寫我

漫天的我落在楓葉上雪花上

而你在想我

螃蟹不可能在剝我的殼

筆記本不可能在寫我

我不可能落在楓葉上雪花上

而你不可能在想我

是我在剝螃蟹殼

是我在寫筆記本

是楓葉和雪花落在我的身上

是我在想你

除非世界颠倒你才會愛上我