日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

令牌桶限流之redis-cell的安装,使用,详解

發(fā)布時(shí)間:2024/2/28 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 令牌桶限流之redis-cell的安装,使用,详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(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.打開地址: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) 400

0表示取出成功,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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。