天天看點

redis通路擊穿/穿透/雪崩

在某個時刻,redis中的一個key被淘汰了,但是瞬間有大量的請求找這個key,找不到,導緻請求被壓到db端。

解決方案

所有client都通路key

失敗以後調用setnx()

3-1. 上面成功的client去通路db,并更新redis。

3-2. 上面setnx失敗的client,随機sleep幾百毫秒,然後重複步驟1。

問題

這個setnx成功的client挂了

-> 設定setnx的過期時間。

setnx的過期時間太短,或者db通路有堵塞,導緻在更新redis之前,設定setnx的鎖過期了,這樣就會有第二個client再去db取值,造成循環。

-> 多線程,一個線程取db,另一個線程監控是否db操作完成,如果沒有那就再更新setnx的timeout值。

業務要查詢的資料是這個系統不存在的資料,造成redis失效,db空轉。

使用布隆過濾器

client包含所有

client包含算法,bitmap放入redis

redis中加入bloom filter pattern

布隆過濾器隻能增加,不能删除。

-> 布谷鳥過濾器/空key

大量key同時失效,造成大量通路到達db

redis的key使用随機過期時間

零點所有key必須過期(類似金融系統,某個時間點開始使用新的參數)

-> 還是不可以用,這時就要依賴擊穿方案。

-> 在前端業務層加判斷零點延時,避免同時産生大量請求的情況。

時點性無關 -> 可以用

繼續閱讀