最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis?lua限流算法實現(xiàn)示例

 更新時間:2022年07月15日 12:01:52   作者:時光沉舊了少年  
這篇文章主要為大家介紹了redis?lua限流算法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

限流算法

常見的限流算法

  • 計數(shù)器算法
  • 漏桶算法
  • 令牌桶算法

計數(shù)器算法

  顧名思義,計數(shù)器算法是指在一定的時間窗口內允許的固定數(shù)量的請求.比如,2s內允許10個請求,30s內允許100個請求等等.如果設置的時間粒度越細,那么相對而言限流就會越平滑,控制的粒度就會更細.

場景分析

試想,如果設置的粒度比較粗會出現(xiàn)什么樣的問題呢?如下圖設置一個 1000/3s 的限流計數(shù)統(tǒng)計.

圖中的限流策略為3s內允許的最大請求量為1000,那么會出現(xiàn)2個極端:
 

極端情況1:

  • 第1s請流量為10,  
  • 第2s請流量為10,  
  • 第3s請流量突然激增到980.這意味著在這一刻,有大量的請求蜂擁而至,假設服務每秒能處理的

上線為800/1s,但是此刻卻有超過這個量級的請求量,那么后果是不堪設想的.

極端情況2:  

  • 第1s請流量突然就達到990,
  • 留給后續(xù)第2s,3s的可請求數(shù)量就非常少了,可能會出現(xiàn)大量的拒絕請求.

結論:

如果用統(tǒng)計計數(shù)算法,盡量保持粒度切割精細.

算法實現(xiàn)

redis的ttl特性完美的滿足了這一需求,將時間窗口設置為key的失效時間,然后將key的值每次請求+1即可.偽代碼實現(xiàn)思路:

//1.判斷是否存在該key
if(EXIT(key)){
  // 1.1自增后判斷是否大于最大值,并返回結果
  if(INCR(key) > maxPermit){
     return false;
  }
 return true;
}
//2.不存在key,則設置key初始值為1,失效時間為3秒
SET(KEY,1);
EXPIRE(KEY,3);

漏銅算法

漏桶算法核心概念:

  • 桶的容量是固定的,并且水流以一個固定的速率流出;
  • 流入的水流可以是任意速率;
  • 如果流入的水流超出了桶的容量,則后續(xù)流入的水流溢出(請求被丟棄)。
  • 如果桶內沒有水,則不需要流出

缺點:

不難想象漏桶算法并不能很好的應對突發(fā)的流量限制,在某一個時間段流量激增,則漏桶算法處理就比較無能為力.這個時候就需要用到和他相反設計的令牌桶算法

令牌桶算法:

如上圖所示,整個請求流程一目了然.簡單概括如下:

1.用戶請求資源時首選從桶里獲取令牌,如果有令牌則放行,如此同時桶里的令牌數(shù)量-1

2.于此同時,以一定的速率往桶里加入令牌,這個速度是可根據(jù)實際場景隨意設置.

算法實現(xiàn)

var key;
var maxPermit;//桶的容量,即最大請求限制
var expire;//失效時間
var bucketInterval;//每次向桶里添加令牌的時間間隔
var bucketNum;//每次向桶里添加令牌的個數(shù)
var lastTimeKey = key +"last";//標記上一次操作時間
//判斷是否存在該key
if(EXIT(key)){
  var value = GET(key);
  var diffTime = now() - lastTimeKey;
  // 1.1判斷是否超出時間間隔
  if(diffTime  > bucketInterval){
      // 1.2根據(jù)時間間隔,計算出應該向桶里添加令牌的個數(shù)
      local maxValue = value+math.floor(diff/interval)*step;
      if (maxValue > limit)
         value = limit;
      else
         value = maxValue;
     //設置key的值及操作時間
     SET(key,value);
     SET(lastTimeKey,now());     
  }
  // 2.1在時間間隔內,判斷桶里是否有值
  if(value <= 0){
     reurn false;
  }else{
    // 2.2 減1
    DECR(key);
  }
reture true;
}
//2.不存在key,則設置key初始值為maxPermit-1
SET(key,maxPermit-1);
EXPIRE(lastTimeKey,now());

上面實現(xiàn)代碼只是偽代碼,提供的是一種思路而已. 仔細想來其中某個環(huán)節(jié)其實并不完美.大家可以參考Guava的ratelimit實現(xiàn)思路,他的限流就是基于令牌桶算法,但是比較遺憾的是在單機下的限流.

思考:  

就是時間間隔如果過長的話,一次性向桶里添加的令牌數(shù)量則是桶的最大容量!那么某個時間的瞬間請求過來,服務器的壓力是非常大的.

所以此處增加令牌數(shù)可以設置的稍微合理些,哪怕間隔時間再長!

以上就是redis lua限流算法實現(xiàn)示例的詳細內容,更多關于redis lua限流算法的資料請關注腳本之家其它相關文章!

相關文章

  • Redis數(shù)據(jù)一致性詳解

    Redis數(shù)據(jù)一致性詳解

    文章主要討論了分布式系統(tǒng)中的數(shù)據(jù)一致性模型、緩存使用場景以及數(shù)據(jù)同步策略,一致性模型包括強一致性、弱一致性和最終一致性,緩存使用場景主要在高并發(fā)讀取數(shù)據(jù)時提升性能,數(shù)據(jù)同步策略分為先刪除緩存再更新數(shù)據(jù)庫和先更新數(shù)據(jù)庫再刪除緩存兩種
    2024-11-11
  • Redis 集群搭建和簡單使用教程

    Redis 集群搭建和簡單使用教程

    集群技術是構建高性能網(wǎng)站架構的重要手段,下面這篇文章主要介紹了Redis 集群搭建和簡單使用教程,文中通過示例代碼和圖片介紹的很想,對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • Redis實現(xiàn)用戶簽到的示例代碼

    Redis實現(xiàn)用戶簽到的示例代碼

    Redis的位圖可以高效實現(xiàn)用戶簽到功能,每個bit位對應一個簽到狀態(tài),節(jié)省存儲空間,利用SETBIT、GETBIT等命令操作簽到數(shù)據(jù),可統(tǒng)計連續(xù)簽到天數(shù)和本月簽到情況,感興趣的可以了解一下
    2024-09-09
  • 全網(wǎng)最完整的Redis新手入門指導教程

    全網(wǎng)最完整的Redis新手入門指導教程

    這篇文章主要給大家介紹了Redis新手入門的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Redis中的數(shù)據(jù)結構跳表詳解

    Redis中的數(shù)據(jù)結構跳表詳解

    跳表是一種基于并聯(lián)的鏈表結構,用于在有序元素序列中快速查找元素的數(shù)據(jù)結構,本文給大家介紹Redis中的數(shù)據(jù)結構跳表,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • redis如何后臺啟動的方法

    redis如何后臺啟動的方法

    這篇文章主要介紹了redis如何后臺啟動的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Redis連接池監(jiān)控(連接池是否已滿)與優(yōu)化方法

    Redis連接池監(jiān)控(連接池是否已滿)與優(yōu)化方法

    本文詳細講解了如何在Linux系統(tǒng)中監(jiān)控Redis連接池的使用情況,以及如何通過連接池參數(shù)配置、系統(tǒng)資源使用情況、Redis命令監(jiān)控、外部監(jiān)控工具等多種方法進行檢測和優(yōu)化,以確保系統(tǒng)在高并發(fā)場景下的性能和穩(wěn)定性,討論了連接池的概念、工作原理、參數(shù)配置,以及優(yōu)化策略等內容
    2024-09-09
  • Redis服務器優(yōu)化方式

    Redis服務器優(yōu)化方式

    文章分享了常見的Redis服務器優(yōu)化技巧和策略,主要包括內存管理、持久化配置、連接配置和網(wǎng)絡優(yōu)化四個方面,內存管理主要是設置maxmemory參數(shù)和選擇合適的內存淘汰策略,持久化配置包括RDB持久化和AOF持久化
    2024-09-09
  • Redis Cluster 集群搭建你會嗎

    Redis Cluster 集群搭建你會嗎

    這篇文章主要介紹了Redis Cluster 集群搭建過程,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能

    使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能

    這篇文章主要介紹了使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能,本文通過圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08

最新評論

林州市| 海丰县| 安义县| 吕梁市| 恩施市| 陇南市| 博爱县| 安溪县| 丹巴县| 正安县| 莫力| 察哈| 辉县市| 东阿县| 山东| 云浮市| 伊金霍洛旗| 象州县| 同江市| 墨竹工卡县| 门头沟区| 砚山县| 嘉兴市| 长春市| 尉氏县| 白银市| 铜鼓县| 岫岩| 抚远县| 襄樊市| 思茅市| 宁夏| 玛曲县| 阳山县| 页游| 沧源| 长泰县| 韶山市| 富民县| 大悟县| 宁都县|