<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ### 令牌桶算法 系統會維護一個令牌(`token`)桶,以一個恒定的速度往桶里放入令牌(`token`),這時如果有請求進來想要被處理,則需要先從桶里獲取一個令牌(`token`),當桶里沒有令牌(`token`)可取時,則該請求將被拒絕服務。令牌桶算法通過控制桶的容量、發放令牌的速率,來達到對請求的限制 ![](../../../images/screenshot_1617861833430.png) <details> <summary>Redis + Lua</summary> ``` Lua腳本大致邏輯如下: -- 獲取調用腳本時傳入的第一個key值(用作限流的 key) local key = KEYS[1] -- 獲取調用腳本時傳入的第一個參數值(限流大小) local limit = tonumber(ARGV[1]) -- 獲取當前流量大小 local curentLimit = tonumber(redis.call('get', key) or "0") -- 是否超出限流 if curentLimit + 1 > limit then -- 返回(拒絕) return 0 else -- 沒有超出 value + 1 redis.call("INCRBY", key, 1) -- 設置過期時間 redis.call("EXPIRE", key, 2) -- 返回(放行) return 1 end ``` </details> <br/> <details> <summary>main.go</summary> ``` package main import ( "fmt" "sync" "time" ) type TokenBucket struct { rate int64 //固定的token放入速率, r/s capacity int64 //桶的容量 tokens int64 //桶中當前token數量 lastTokenSec int64 //桶上次放token的時間戳 s lock sync.Mutex } func (l *TokenBucket) Allow() bool { l.lock.Lock() defer l.lock.Unlock() now := time.Now().Unix() l.tokens = l.tokens + (now-l.lastTokenSec)*l.rate // 補充令牌 if l.tokens > l.capacity { l.tokens = l.capacity } l.lastTokenSec = now if l.tokens > 0 { // 還有令牌,領取令牌 l.tokens-- return true } else { // 沒有令牌,則拒絕 return false } } func (l *TokenBucket) Set(rate, capacity int64) { l.rate = rate l.capacity = capacity l.tokens = 0 l.lastTokenSec = time.Now().Unix() } func main() { var bucket TokenBucket bucket.Set(10,100) for i:=0; i<100000; i++ { if bucket.Allow() { fmt.Printf("%+v s,i=%d\n", i/100,i ) }else if i%100==0 { fmt.Printf("%+v s\n", i/100 ) } time.Sleep(1*time.Millisecond) } } ``` </details> <br/> **優點**: - 令牌桶算法則能夠滿足這些具有突發特性的流量 - 漏桶算法與令牌桶算法可以結合起來為網絡流量提供更大的控制
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看