本篇文章給大家分享一下令牌桶算法原理,并介紹一下利用Redis實現(xiàn)令牌桶算法的方法,希望對大家有所幫助!
在限流算法中有一種令牌桶算法,該算法可以應(yīng)對短暫的突發(fā)流量,這對于現(xiàn)實環(huán)境中流量不怎么均勻的情況特別有用,不會頻繁的觸發(fā)限流,對調(diào)用方比較友好。
例如,當前限制10qps,大多數(shù)情況下不會超過此數(shù)量,但偶爾會達到30qps,然后很快就會恢復正常,假設(shè)這種突發(fā)流量不會對系統(tǒng)穩(wěn)定性產(chǎn)生影響,我們可以在一定程度上允許這種瞬時突發(fā)流量,從而為用戶帶來更好的可用性體驗。這就是使用令牌桶算法的地方。
令牌桶算法原理
如下圖所示,該算法的基本原理是:有一個容量為X的令牌桶,每Y單位時間內(nèi)將Z個令牌放入該桶。如果桶中的令牌數(shù)量超過X,那么它將被丟棄。處理請求時,需要先從令牌桶中取出令牌,如果拿到了令牌,則繼續(xù)處理;如果拿不到令牌,則拒絕請求。
可以看出,在令牌桶算法中設(shè)置X,Y和Z的數(shù)量尤為重要。Z應(yīng)該比每Y單位時間內(nèi)的請求數(shù)稍大,系統(tǒng)將長時間處于此狀態(tài);X是系統(tǒng)允許的瞬時最大請求數(shù),并且系統(tǒng)不應(yīng)該長時間處于此狀態(tài),否則就會頻繁觸發(fā)限流,此時表明流量出現(xiàn)了超預(yù)期的情況,需要及時調(diào)查原因并采取相應(yīng)措施。
Redis實現(xiàn)令牌桶算法
之前看過有些程序?qū)崿F(xiàn)的令牌桶,其向桶中放入令牌的方法是啟動一個線程,每隔Y單位時間增加一次令牌數(shù)量,或者在Timer中定時執(zhí)行這一過程。我不太滿意這種方法, 原因有二,一是浪費線程資源,二是因為調(diào)度的問題執(zhí)行時間不精確?!?/p>