緩存穿透
緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在,這樣緩存永遠不會生效,這些請求都會達到數據庫。
1)方案1:緩存空對象
在緩存中存儲一個空值每次讀取這個空
優點:實現簡單,維護方便
缺點:造成額外的內存消耗(可以在設置緩存為null時,設置一個TTL)
可能造成短期不一致(TTL之內數據庫插入了該條數據)
2)方案2:布隆過濾器
布隆過濾器是一種空間效率極高的概率性數據結構,用于判斷一個元素是否屬于某個集合。
數據結構組成
位數組(Bit Array):一個長度為?m?的二進制數組,初始全為 0。
哈希函數集合:k?個獨立的哈希函數,每個函數能將元素映射到?\([0, m-1]\)?的范圍內。
對?x?應用同樣的?k?個哈希函數,得到?k?個位置。
檢查這些位置的二進制位是否全為 1:
若全為 1,可能存在(可能是假陽性)。
若至少有一個為 0,一定不存在(無假陰性)。
也就是說,布隆過濾器說存在,不一定存在。說不存在,那一定不存在
所以仍然有一定的可能性會發生穿透
優點:內存占用少,沒有多余key
缺點:實現復雜,存在誤判可能
緩存雪崩
緩存雪崩是指在同一時段大量的緩存Key同時失效或者Redis服務宕機,導致大量請求直接到達數據庫,帶來巨大壓力
方案
解決方案1:給不同的Key的TTL添加隨機量
解決方案2:利用Redis集群提高服務的可用性
解決方案3:給緩存業務添加降級限流策略
解決方案4:給業務添加多級緩存
緩存擊穿
緩存擊穿問題也叫熱點key問題
就是一個被高并發訪問并緩存重建業務較復雜的key突然失效了,無數的請求訪問會瞬間給數據庫帶來巨大壓力。

1)方案1:互斥鎖

性能較差,多個線程會互相等待
2)方案2:邏輯過期
我們給key在邏輯上加一個過期時間
對比兩個解決方案的優缺點