redis快取常見問題及解決方案

2021-10-06 12:52:54 字數 1084 閱讀 8117

快取雪崩

當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓 力。導致系統崩潰。

解決方案:

在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個線 程查詢資料和寫快取,其他執行緒等待。

做二級快取,a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為 短期,a2設定為長期 。

將快取失效時間分散開,比如可以在原有的失效時間基礎上增加乙個隨機值, 比如 1-5 分鐘隨機,這樣每乙個快取的過期時間的重複率就會降低,就很難引發集體失效 的事件。

快取穿透

一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如 db)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫 做快取穿透。

解決方案:

對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理 快取。

布隆過濾器:將所有可能存在的資料雜湊到乙個足夠大的 bitmap 中,乙個一定不存在的資料 會被這個 bitmap 攔截掉,從而避免了對 db 的查詢。

快取擊穿

對於設定了過期時間的 key,快取在某個時間點過期的時候,恰好這時間點對 這個 key 有大量的併發請求過來,這些請求發現快取過期一般都會從後端 db 載入資料並 回設到快取,這個時候大併發的請求可能會瞬間把 db 壓垮。

解決方案:

永遠不過期:物理不過期,但邏輯過期(後台非同步執行緒去重新整理)。

使用互斥鎖:當快取失效時,不立即去 load db,先使用如 redis 的 setnx 去設 置乙個互斥鎖,當操作成功返回時再進行 load db 的操作並回設快取,否則重試 get 快取的 方法。

public string get

(key)

else

}else

}

Redis快取常見問題及解決方案

可以簡單的理解為 系統剛剛部署完畢,所有快取資料還未準備完畢或者由於原有快取有效期集體到達 例如 系統中所有快取都設定的一致的過期時間,在同一時刻出現大面積的快取過期,所以原本應該查詢快取的請求都去查詢資料庫了,造成資料庫壓力驟增,甚至宕機.使用加鎖或者佇列的方式保證不會有大量執行緒對資料庫進行一次...

Redis快取常見問題

這是決定在使用快取時就該考慮的問題。快取的資料在資料來源發生變更時需要對快取進行更新,資料來源可能是 db,也可能是遠端服務。更新的方式可以是主動更新。資料來源是 db 時,可以在更新完 db 後就直接更新快取。當資料來源不是 db 而是其他遠端服務,可能無法及時主動感知資料變更,這種情況下一般會選...

Redis 快取常見問題 快取一致性的解決方案

先更新資料庫,再刪除快取 redis 快取常見問題 快取雪崩,快取擊穿,快取穿透,快取預熱 在之前的部落格中,我介紹了redis快取的一些常見問題,如 快取雪崩 快取擊穿 快取穿透等。這次就來介紹一下redis的快取一致性的問題。對於快取和資料庫的更新操作,主要分為以下兩種 首先可能會帶來疑惑的點是...