1. 程式人生 > 其它 >快取擊穿、快取穿透和快取雪崩及對應解決方案

快取擊穿、快取穿透和快取雪崩及對應解決方案

我們都知道,如果資料庫壓力大的話,可以考慮加Redis等做快取。但是並不是說加了快取就沒問題,我們還需要考慮增加快取後,會引入什麼風險。常見的問題包括快取擊穿、快取穿透和快取雪崩等。

快取擊穿:快取中沒有(某熱點key剛好失效),資料庫中有。可以簡單理解為某一熱點key剛好到失效時間,一失效後導致訪問這一熱點key的請求在快取中匹配不到,大量請求直接訪問到資料庫,導致資料庫壓力劇增。

快取穿透:快取中沒有,資料庫中沒有。請求訪問在快取和資料庫中都不存在的資料,導致請求頻繁訪問資料庫。一旦這種請求數量達到一定規模,很可能就直接壓垮資料庫。比較直接的例子就是,黑客惡意攻擊,就會用不會存在的資料例如使用者id為-1發起大量請求,快取中不會存在這種資料,資料庫也沒有這種資料,所以這些大量異常的請求就會穿過快取,直接查詢資料庫,可能導致資料庫處理不過來崩潰。

快取雪崩:快取中沒有(大批量快取同時失效),資料庫中有。大量快取key在同一時間內失效,導致大量請求直接打到資料庫。

解決方案如下:

快取擊穿:(1)設定熱點key永不失效(2)增加互斥鎖,當某一熱點key失效時,進來的請求,只允許第一條查詢資料庫,其他等待

快取穿透:(1)對於查詢快取中不存在的值,直接快取該值等於null(2)

快取雪崩:(1)快取過期時間設定成隨機值(2)增加互斥鎖