91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis?lua限流算法如何實現

發布時間:2022-07-15 13:46:24 來源:億速云 閱讀:221 作者:iii 欄目:開發技術

本篇內容介紹了“redis lua限流算法如何實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    限流算法

    常見的限流算法

    • 計數器算法

    • 漏桶算法

    • 令牌桶算法

    計數器算法

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

    場景分析

    試想,如果設置的粒度比較粗會出現什么樣的問題呢?如下圖設置一個 1000/3s 的限流計數統計.

    redis?lua限流算法如何實現

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

    極端情況1:

    • 第1s請流量為10,  

    • 第2s請流量為10,  

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

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

    極端情況2:  

    • 第1s請流量突然就達到990,

    • 留給后續第2s,3s的可請求數量就非常少了,可能會出現大量的拒絕請求.

    結論:

    如果用統計計數算法,盡量保持粒度切割精細.

    算法實現

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

    //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);

    漏銅算法

    漏桶算法核心概念:

    • 桶的容量是固定的,并且水流以一個固定的速率流出;

    • 流入的水流可以是任意速率;

    • 如果流入的水流超出了桶的容量,則后續流入的水流溢出(請求被丟棄)。

    • 如果桶內沒有水,則不需要流出

    redis?lua限流算法如何實現

    缺點:

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

    令牌桶算法:

    redis?lua限流算法如何實現

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

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

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

    算法實現

    var key;
    var maxPermit;//桶的容量,即最大請求限制
    var expire;//失效時間
    var bucketInterval;//每次向桶里添加令牌的時間間隔
    var bucketNum;//每次向桶里添加令牌的個數
    var lastTimeKey = key +"last";//標記上一次操作時間
    //判斷是否存在該key
    if(EXIT(key)){
      var value = GET(key);
      var diffTime = now() - lastTimeKey;
      // 1.1判斷是否超出時間間隔
      if(diffTime  > bucketInterval){
          // 1.2根據時間間隔,計算出應該向桶里添加令牌的個數
          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());

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

    思考:&ensp;&ensp;

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

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

    “redis lua限流算法如何實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    阜新| 化隆| 育儿| 北流市| 大港区| 南漳县| 扎囊县| 宝清县| 鹤岗市| 清苑县| 普定县| 昭平县| 牡丹江市| 东山县| 定兴县| 彩票| 沙洋县| 永泰县| 江孜县| 湘乡市| 阿图什市| 阳春市| 张家口市| 惠安县| 万盛区| 汤原县| 民县| 中江县| 兴文县| 昌平区| 延边| 乐都县| 宁夏| 华安县| 龙门县| 资中县| 武隆县| 南安市| 道真| 枣阳市| 高阳县|