目錄:
1、概念
2、解決方案
3、代碼案例
一、概念
1.1 緩存穿透(惡意請求):key對應的數據在數據庫不存在,每次針對key的請求從緩存獲取不到數據,從數據源也取不到數據(每次都要查詢數據庫,緩存形同虛設)。如:Redis緩存中沒有uid=10000的用戶信息,DB數據庫中也沒有。
1.2 緩存擊穿(key失效):redis中有對應key和數據,當key過期時,此時有大量請求過來,請求發現緩存中沒有數據,會從數據庫中加載數據並set到緩存中,從而壓垮數據源(數據庫)。
1.3 緩存雪崩(服務重啟/大量key失效):redis在一段時間內大量key失效。此時有大量請求,使請求直接命中數據庫,導致數據庫連接異常。
二、解決方案:
2.1 緩存穿透方案
布隆過濾 即在查詢之前需要驗證key的合法性或在數據庫命中為空時設置空的緩存對象(需要注意對業務的影響)。
2.2 緩存擊穿及緩存雪崩方案:
(1)給有失效時間的key加上一個隨機數值,避免key的集體失效。
(2)進行數據預熱(秒殺系統)將有可能會失效的key進行預先更新緩存時間。
(3)緩存備份 redis01失效後命中 redis02。
(4)加入鎖機制進行限流操作。
三、代碼樣例
3.1 布隆過濾(可自己根據業務定製過濾方式如:維護自己的合法key的Cache)。
3.2 緩存雪崩(接口限流或服務降級)
比如令牌桶算法限流