一揪阿、固定窗口限流
實(shí)現(xiàn)方式:通過使用redis的incrementAndGet的原子操作實(shí)現(xiàn)琅攘,例如要想實(shí)現(xiàn)100tps的限流玩般。
當(dāng)系統(tǒng)第一次請(qǐng)求的時(shí)候高每,初始化key的值為1屿岂,并設(shè)置redis的Key的超時(shí)時(shí)間為1秒,每次請(qǐng)求使用incrementAndGet方式加1鲸匿,時(shí)間過期之后會(huì)迭代到下一個(gè)窗口爷怀。
優(yōu)點(diǎn):簡(jiǎn)單的實(shí)現(xiàn)分布式的限流,
缺點(diǎn):在窗口開始的0.0 ~ 0.1時(shí)間內(nèi)带欢,請(qǐng)求了100次訪問也不會(huì)限流(實(shí)際這時(shí)候的tps已經(jīng)達(dá)到了1000tps)运授,而0.1~1.0這段時(shí)間的請(qǐng)求無論幾次都會(huì)被限流烤惊。
二、滑動(dòng)窗口算法:
類似于TCP中的流量控制算法吁朦,可以通過redis的ZSet實(shí)現(xiàn)柒室,ZSet中保留窗口內(nèi)的每次請(qǐng)求時(shí)間戳,
Sentinel 基于滑動(dòng)窗口的限流
三逗宜、漏桶算法:
主要通過記錄上級(jí)訪問的時(shí)間和當(dāng)前時(shí)間的差值雄右,計(jì)算一次訪問的TPS。
四纺讲、令牌桶算法:
Redission的Lua腳本實(shí)現(xiàn)擂仍,比如Guava的RateLimiter使用了令牌桶