“人生沒有白走的路,每一步都算數。”
使用 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 的差別
我 一 直 不 知 道
喜 為 何 物
歡 有 何 由
你 的 出 現 給 了 我 答 案
來點開心的
武漢大學三行情書大賽冠軍作品

螃蟹在剝我的殼
筆記本在寫我
漫天的我落在楓葉上雪花上
而你在想我
螃蟹不可能在剝我的殼
筆記本不可能在寫我
我不可能落在楓葉上雪花上
而你不可能在想我
是我在剝螃蟹殼
是我在寫筆記本
是楓葉和雪花落在我的身上
是我在想你
除非世界颠倒你才會愛上我