令牌桶限流之redis-cell的安装,使用,详解
簡(jiǎn)言
1. redis使用有序集合zset也能實(shí)現(xiàn)簡(jiǎn)單的限流,但是只能處理幾十,幾百的量級(jí),因?yàn)閦set需要記錄每一條信息,很占據(jù)空間。要想處理更大數(shù)量級(jí)的限流,必須使用其他方法
2.?通常的限流算法有兩種,漏斗算法,令牌桶算法,本篇博客要講的redis-cell是使用令牌桶算法實(shí)現(xiàn)的
3. redis-cell的官方地址:https://github.com/brandur/redis-cell
4. redis-cell只有一個(gè)命令 cl.throttle,使用很簡(jiǎn)單,需要注意的是最后一個(gè)參數(shù)為正時(shí)表取出令牌,為負(fù)時(shí)表放入令牌,不填時(shí)默認(rèn)為1
5. 《Redis深度歷險(xiǎn)》一書中對(duì)redis-cell的介紹是錯(cuò)誤的,書中以為?cl.throttle 設(shè)置的是容量,其實(shí)不然,設(shè)置的是 “容量-1”,比如設(shè)置99時(shí),容量則為100
?
安裝(由于redis-cell是使用rust語(yǔ)言編寫的,而本人對(duì)rust毫無(wú)研究,也不想去部署rust的環(huán)境,所以直接下載編譯好的動(dòng)態(tài)庫(kù)so文件,不再源碼編譯)
1.打開(kāi)地址:https://github.com/brandur/redis-cell/releases,挑選適合自己環(huán)境的壓縮包,下載最新的,本人是ubuntu環(huán)境,下載linux版的即可,下載到/usr/local/redis/redis-stable目錄,并解壓
? ??
? ??
2. 修改要使用的redis.conf文件,添加一行 “loadmodule /usr/local/redis/redis-stable/libredis_cell.so”,保存后,重啟redis即可
? ??
3. 連接進(jìn)我們的redis,運(yùn)行命令?module list ,可以查看目前已經(jīng)啟用的module
? ??
?
使用
如上面簡(jiǎn)言所述,redis-cell使用很簡(jiǎn)單,只有一個(gè)命令
命令格式:cl.throttle ?key名字? ?令牌桶容量-1 ? 令牌產(chǎn)生個(gè)數(shù) ? 令牌產(chǎn)生時(shí)間 本次取走的令牌數(shù)?(不寫時(shí)默認(rèn)1,負(fù)值表放入令牌)
返回格式:0成功,1失敗
? ? ? ? ? ? ? ? ? ?令牌桶的容量
? ? ? ? ? ? ? ? ? ?當(dāng)前桶內(nèi)剩余的令牌數(shù)
? ? ? ? ? ? ? ? ? ?成功時(shí)該值為-1,失敗時(shí)表還需要等待多少秒可以有足夠的令牌
? ? ? ? ? ? ? ? ? ?表預(yù)計(jì)多少秒后令牌桶會(huì)滿
示例1(key:mybag,該key不存在時(shí)會(huì)新建,容量為100(也就是99+1=100), 每10秒產(chǎn)生1個(gè)令牌,本次取出40個(gè))
127.0.0.1:6379> cl.throttle mybag 99 1 10 40 1) (integer) 0 2) (integer) 100 3) (integer) 60 4) (integer) -1 5) (integer) 4000表示取出成功,100表令牌桶容量,60表桶內(nèi)剩余令牌數(shù),-1表成功即本次取令牌不需等待,400表預(yù)計(jì)還需要400秒令牌桶會(huì)滿,根據(jù)我們的速度設(shè)定,每10秒產(chǎn)生一個(gè)令牌,確實(shí)是需要400秒
示例2(從mybag的令牌桶中再取出40個(gè))
127.0.0.1:6379> cl.throttle mybag 99 1 10 40 1) (integer) 0 2) (integer) 100 3) (integer) 20 4) (integer) -1 5) (integer) 798 127.0.0.1:6379> cl.throttle mybag 99 1 10 40 1) (integer) 1 2) (integer) 100 3) (integer) 20 4) (integer) 196 5) (integer) 796第一次的0表示取出成功,100表令牌桶容量,20表桶內(nèi)剩余令牌數(shù),-1表成功即本次取令牌不需等待,798表預(yù)計(jì)還需要798秒令牌桶會(huì)滿
第二次的1表示取出失敗,100表令牌桶容量,20表桶內(nèi)剩余令牌數(shù),196表失敗,還需要等待196秒可以重試本次操作,796表預(yù)計(jì)還需要796秒令牌桶會(huì)滿
示例3(往mybag的令牌桶中先放入40個(gè),再取出40個(gè))
127.0.0.1:6379> cl.throttle mybag 99 1 10 -40 1) (integer) 0 2) (integer) 100 3) (integer) 126 4) (integer) -1 5) (integer) -262 127.0.0.1:6379> cl.throttle mybag 99 1 10 40 1) (integer) 0 2) (integer) 100 3) (integer) 60 4) (integer) -1 5) (integer) 400放入40個(gè)時(shí),0表放入成功,126就沒(méi)啥意義了,因?yàn)樽畲笕萘坎?00,當(dāng)然桶內(nèi)不可能有126個(gè);-262更詭異了,桶滿了就滿了唄,干嘛告訴我需要負(fù)262秒呢,感覺(jué)桶滿時(shí)0更準(zhǔn)確
我們驗(yàn)證前面的猜想,馬上再取出40個(gè)可以看到結(jié)果值0表成功,60表桶內(nèi)還剩下60個(gè)令牌,即容量100減去本次的40得到,也就驗(yàn)證了第一次返回的126毫無(wú)意義
總結(jié)
以上是生活随笔為你收集整理的令牌桶限流之redis-cell的安装,使用,详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: redis module模块简单使用
- 下一篇: redis事务原理,使用,详解