Redis快取穿透,快取擊穿,快取雪崩
阿新 • • 發佈:2021-07-14
Redis快取處理流程:
前臺請求,後臺先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。
1.快取穿透
指的是大量請求都在查詢一個不存在key,,導致所有請求最終都落在資料庫上,,造成資料庫壓力巨大
解決: 1)針對不存在的key也快取一個null值,,同時設定一個過期時間,,(弊端:記憶體中可能會存放大量無效key) 2)採用布隆過濾器,,對於不存在的key直接返回null值
2.快取擊穿
指的是某個key在過期時間點上(記憶體已過期,,但資料庫有資料),,此時有大量請求去查詢這個key,,導致資料庫壓力增大
解決:1)設定熱點資料永不過期 2)加鎖setnx public String get(key) { String value = redis.get(key); if (value == null) { //代表快取值過期 //設定3min的超時,防止del操作失敗的時候,下次快取過期一直不能load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表設定成功 value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); }else { //這個時候代表同時候的其他執行緒已經load db並回設到快取了,這時候重試獲取快取值即可 sleep(50); get(key); //重試 } } else { return value; } }
3.快取雪崩
快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。 和快取擊穿不同的是, 快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
解決:1)設定熱點資料永不過期 2)快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生