国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

大型網站限流算法的實現和改造

DC_er / 1470人閱讀

摘要:涉及變量接口時間單位允許訪問多少次遞增間隔時間遞增步長當前可訪問次數的訪問時間當前時間參照漏桶算法需要注意的點條件一線程一存在不能訪問添加,設置為線程二過去時間所有的條件二參考計算器算法條件二實現。算法升級參考漏桶算法升級實現。

最近寫了一個限流的插件,所以避免不了的接觸到了一些限流算法。本篇文章就來分析一下這幾種常見的限流算法
分析之前

依我個人的理解來說限流的話應該靈活到可以針對每一個接口來做。比如說一個類里面有5個接口,那么我的限流插件就應該能針對每一個接口就行不同的限流方案。所以呢,既然針對的每個接口所以就需要一個可以唯一標示這個接口的key(我取的是類名+方法名+入參)。分布式限流強烈推薦使用redis+lua或者nginx+lua來實現。


這里用2個限流條件來做示例講一下常見的限流算法:
   1.  接口1它10秒鐘最大允許訪問100次
   2.  接口2它10秒鐘最大允許每個人訪問100次。
計數器算法
這個算法可以說是限流算法中最簡單的一種算法了。
核心思想

計數器算法的意思呢就是當接口在一個時間單位中被訪問時,我就記下來訪問次數,直到它訪問的次數到達上限。
涉及變量

1.接口(key)
2.時間單位(expire)
3.允許訪問多少次(limit)
4.訪問次數(value)
條件一

當一個請求過來時,我們就會得到這個key。


if(存在key){
   value++;
   if(value>=limit){
           不能訪問
       }
   }else{
       添加key,value為1
       設置key過期時間為expire
   }
條件二
既然條件一已經實現了,那條件二會復雜么 ?

相比于條件一來說就是同一個key對應了多個用戶。那么我們只需要把key加上用戶的信息就可以了。比如說 key_用戶1、key_用戶2。

漏桶算法 核心思想

漏桶算法的意思呢就是一個接口在一個時間單位中允許被訪問次數是動態變化的(假如一分鐘允許訪問60次,那么從開始計時時不管有沒有被訪問第59秒只允許訪問59次,30秒只允許30次)。為什么這樣呢,因為有另外一個線程在進行遞減操作

涉及變量
1.接口(key)
2.時間單位(expire)
3.允許訪問多少次(limit)
4.遞減間隔時間(interval)
5.遞減步長(step)
6.剩余可訪問次數(value)
7.key的訪問時間(lastUpdateTime)
8.當前時間(nowTime)(注意nowTime的取值應為應用取得的時間而不是redis或者nginx取得的時間)
條件一 線程一:

1

if(存在key){
   value--;
   if(value<=0){
           不能訪問
       }
   }else{
       添加key,設置value為limit
   }
線程二:
while(過去interval時間){
   所有key的value-step
   }
條件二

參考計數器算法條件二實現。

算法升級

可以看到實現漏桶算法的話需要每隔interval時間都要另外一條線程去遍歷所key的value去做遞減操作,那么有沒有什么辦法可以省略這一步呢。答案是肯定有。

if(存在key){
   value--;
   if((nowTime-lastUpdateTime)>interval){
       value=value-(nowTime-lastUpdateTime)/interval*step;
       lastUpdateTime=nowTime;
   }
   if(value<=0){
           不能訪問
       }
   }else{
       添加key,設置value為limit;
       lastUpdateTime=nowTime;
   }
令牌桶算法 核心思想

令牌桶算法呢,恰恰是和漏桶算法相反的一個算法,不過還是推薦你使用這個。這個算法的原理我不講,我覺得聰明的你看了偽代碼就明白了。
涉及變量

1.接口(key)
2.時間單位(expire)
3.允許訪問多少次(limit)
4.遞增間隔時間(interval)
5.遞增步長(step)
6.當前可訪問次數(value)
7.key的訪問時間(lastUpdateTime)
8.當前時間(nowTime)(參照漏桶算法需要注意的點)
條件一 線程一:
if(存在key){
   value++;
   if(value>=limit){
           不能訪問
       }
   }else{
       添加key,設置value為limit
   }
線程二:
while(過去interval時間){
   所有key的value+step
   }
條件二

參考計算器算法條件二實現。

算法升級

參考漏桶算法升級實現。

代碼

代碼實現請參考我的限流組件 https://github.com/2388386839...

本文出自http://zhixiang.org.cn,轉載請保留。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77319.html

相關文章

  • 阿里七層流量入口 Tengine硬件加速探索之路

    摘要:今天分享的主題是阿里七層流量入口硬件加速探索之路。業務驅動了技術創新,年接入層在硬件加速領域邁出了第一步。三監控,對硬件加速相關的資源指標進行實時監控和報警,防患于未然。硬件加速效果上線后我們獲得了一些加速效果的數據。 摘要: Tengine在軟件層面已經有了深度的調試和優化經驗,但是在硬件層面,通用處理器(CPU)已經進入了摩爾定律,有了瓶頸。而在業務量突飛猛進的當下,如何利用硬件來...

    shadajin 評論0 收藏0
  • 人工智能幫助千萬用戶完成「隱形征信」計算

    摘要:量化派是一家數據驅動的科技金融公司,通過人工智能大數據機器學習等前沿技術提供消費信貸撮合及消費場景下的白條服務,每年處理千萬級用戶信用及信用消費申請。 「小楊」最近裝修房子,準備去銀行貸款,但是聽說好多人會因為個人征信問題被銀行拒絕貸款!于是,他先查了一下自己的央行征信,發現竟然沒有自己的征信信息,「小楊」陷入了沉思,自己經常在淘寶、jd 上買東西,也有淘寶花唄和京東白條,怎么會沒有征...

    Developer 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<