redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

網際網路產品的流量有時候是不可預知的,為了避免突然的大流量對系統造成衝擊會對關鍵介面進行限流,限流策略有很多,目前我們用到的也是比較簡單的方式就是用redis。

redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

第一種:根據時間滑動

介紹:比如統計每5秒內最高請求量是1000,那這個5秒是滑動的,從0到5秒,1到6秒,2到7秒以此類推最大請求量都是1000。要實現這種滑動的限流需要用到redis的zset結構。zset是一個有序的集合,uuid作為值,時間作為排序的分數,根據rangeByScore命令對時間進行排序,然後取出當前時間段內的請求量,紅色部分是當前時間減去滑動視窗的時間。下面的程式碼是:每秒最多5個請求。

redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

第二種:redis的list集合做令牌桶演算法

介紹:令牌桶演算法也稱水桶演算法,水桶演算法意思是往水桶裡面加水,然後再取水,如果取水速度大於加水速度就取不到水了,只能空手而歸。我們現在往redis的list集合裡面加元素,然後請求過來的時候從list裡面取元素,取到了就繼續執行任務,取不到就返回。

redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

具體實現如下:這個是取令牌沒有取到說明請求量過大,leftPop命令是取出資料,並且刪除

redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

放令牌可以用task實現,最好有個配置平臺根據當前流量,伺服器情況實現動態控制。rightPush是從右側插入資料。

redis高併發下限流策略,時間滑動,漏斗演算法,令牌桶演算法

第三種:redis實現漏斗演算法,它也是用list實現的。

介紹:漏斗演算法和水桶演算法的思想剛好相反,一直往木桶裡加水,水桶下面有個洞,一直往外流水,加水速度大於漏水速度水就會滿,這個時候就不能再加了。有請求過來一直往list里加內容,我們再取內容,請求速度大於取出速度就返回了。

如何實現呢?哈哈大家有興趣自己想想怎麼實現吧!

如果覺著寫得不好請多指教,如果覺著對你有幫助也請多關注哈

相關文章

redis分散式鎖,鎖續期

redis 資料型別,string底層結構,穿透,擊穿,雪崩,資料一致性

redis持久化方案:rdb和aof