Redis項目總結--緩存穿透、緩存雪崩、緩存擊穿 一.緩存穿透 1.什麼是緩存穿透 查詢某個 Key 對應的數據,Redis 緩存中沒有相應的數據,則直接到資料庫中查詢。資料庫中也不存在要查詢的數據,則資料庫會返回空,而 Redis 也不會緩存這個空結果。這就造成每次通過這樣的 Key 去查詢數據 ...
Redis項目總結--緩存穿透、緩存雪崩、緩存擊穿
目錄一.緩存穿透
1.什麼是緩存穿透
查詢某個 Key 對應的數據,Redis 緩存中沒有相應的數據,則直接到資料庫中查詢。資料庫中也不存在要查詢的數據,則資料庫會返回空,而 Redis 也不會緩存這個空結果。這就造成每次通過這樣的 Key 去查詢數據都會直接到資料庫中查詢,Redis 不會緩存空結果。這就造成了緩存穿透的問題,給資料庫帶來壓力。
2.緩存穿透解決方案
方案一:緩存空對象,對不存在的key也將空對象進行緩存,並設置過期時間。
- 優點:實現簡單,維護方便。
- 缺點:額外的記憶體消耗,緩存了無用key。可能導致短期的不一致。
方案二:布隆過濾,布隆過濾器可以針對大數據量的、有規律的鍵值進行處理。一條記錄是不是存在,本質上是一個 Bool 值,只需要使用 1bit 就可以存儲。我們可以使用布隆過濾器將這種表示是、否等操作,壓縮到一個數據結構中。用戶查詢時,先詢問過濾器,存在則查詢redis,不存在則直接返回。
- 優點:記憶體占用少,沒有多餘key。
- 缺點:實現複雜。存在誤判可能。
3.流程
原本流程:
使用方案一解決緩存穿透的流程:
二.緩存雪崩
1.什麼是緩存雪崩
同一段時間大量緩存key同時失效(同時到期)或redis宕機導致大量請求到達資料庫,帶來巨大壓力。
2.解決方案
方案一:給不同的key的過期時間添加隨機值,使不同key的過期時間分佈在一個時間段之間。
方案二:利用redis集群提高服務可用性
方案三:給緩存業務添加降級限流策略
方案四:給業務添加多級緩存
三.緩存擊穿
1.什麼是緩存擊穿
緩存擊穿問題也叫熱點key問題,就是一個被高併發訪問且緩存重建業務又比較複雜的的key突然失效,無數的請求訪問會在瞬間給資料庫帶來巨大的衝擊。
2.解決方案
方案一:互斥鎖,加鎖後只有第一個獲取到鎖的人才能繼續去資料庫查詢,重建緩存,未獲取鎖的人不能執行該步驟,只能等待一會再次查詢緩存。
- 優點:沒有額外記憶體消耗。保證了一致性。實現簡單。
- 缺點:線程需要等待,性能受影響。有死鎖風險。
方案二:邏輯過期,熱點key一般是參與秒殺活動的熱門商品,可以將其設置為永不過期而給一個邏輯過期時間,事後手動刪除,查詢緩存發現邏輯過期時,返回過期的數據,若他是第一個獲取到鎖的人開啟新線程去查詢資料庫,重建緩存,重置邏輯過期時間,其他人若在此期間訪問則返回已過期的數據。
- 優點:線程無需等待,性能較好。
- 缺點:不保證一致性。有額外記憶體消耗。實現複雜。
3.流程
互斥鎖:
邏輯過期: