1.常見兩種方式 漏桶算法和令牌桶算法
漏桶算法:1.有一個固定容量的漏桶,已固定的速率流出水滴。
2.可以任意速率流入水滴到漏桶
3.當漏桶滿了,水溢出(相當於丟棄)
令牌桶算法:
1.以固定的速率向桶里放令牌
2.當桶內的令牌數量達到最大值后,后續放入的令牌被丟棄
3.當需要發送N個單位大小的數據時,就從桶內去N個令牌
4.當桶內的令牌數量小於設定的大小時,不能刪除令牌,也就是不能發送數據,這是數據可能被丟棄,也可能被緩沖區緩存下來。
2.其它方式
統計計數,主要思想是記錄指定時間內的訪問量,然后定時將計數清零。
統計計數方式可以使用jedis的incr和expire的api實現,也可以使用並發Map來實現。
nginx中配置限流
3.開源實現
guava RateLimiter ,基於令牌桶算法實現 具體用法參考 http://ifeve.com/guava-ratelimiter/