redis 4.0 之後開始支持擴展模塊,redis-cell 是一個用rust語言編寫的基於令牌桶算法的的限流模塊,提供原子性的限流功能,並容許突發流量,能夠很方便的應用於分佈式環境中。git
該模塊只有1條指令cl.throttle
,它的參數和返回值都略顯複雜,接下來讓咱們來看看這個指令具體該如何使用。github
> cl.throttle laoqian:reply 15 30 60 1 ▲ ▲ ▲ ▲ ▲ | | | | └───── need 1 quota (可選參數,默認值也是1) | | └──┴─────── 30 operations / 60 seconds 這是漏水速率 | └───────────── 15 capacity 這是漏斗容量 └─────────────────── key laoqian
上面這個指令的意思是容許「用戶老錢回覆行爲」的頻率爲每 60s 最多 30 次(漏水速率),漏斗的初始容量爲 15,也就是說一開始能夠連續回覆 15 個帖子,而後纔開始受漏水速率的影響。咱們看到這個指令中漏水速率變成了 2 個參數,替代了以前的單個浮點數。用兩個參數相除的結果來表達漏水速率相對單個浮點數要更加直觀一些。redis
> cl.throttle laoqian:reply 15 30 60 1) (integer) 0 # 0 表示容許,1表示拒絕 2) (integer) 15 # 漏斗容量capacity 3) (integer) 14 # 漏斗剩餘空間left_quota 4) (integer) -1 # 若是拒絕了,須要多長時間後再試(漏斗有空間了,單位秒) 5) (integer) 2 # 多長時間後,漏斗徹底空出來(left_quota==capacity,單位秒)
在執行限流指令時,若是被拒絕了,就須要丟棄或重試。cl.throttle 指令考慮的很是周到,連重試時間都幫你算好了,直接取返回結果數組的第四個值進行 sleep 便可,若是不想阻塞線程,也能夠異步定時任務來重試。算法