Redis快取穿透,快取雪崩以及快取擊穿

2021-10-04 07:46:24 字數 1244 閱讀 2535

概念:

訪問乙個不存在的key,快取不起作用,請求會穿透到db,流量大時db會掛掉。

快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候就相當於出現了快取穿透。

這裡需要注意和快取擊穿的區別,快取擊穿,是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。

解決方案:

1、布隆過濾器:採用布隆過濾器,使用乙個足夠大的bitmap,用於儲存可能訪問的key,不存在的key直接被過濾;

2、快取空物件:訪問key未在db查詢到值,也將空值寫進快取,但可以設定較短過期時間。之後再訪問這個資料將會從快取中獲取,保護了後端資料來源;

概念:

快取雪崩是指,快取層出現了錯誤,不能正常工作了。於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉的情況。如大量的key設定了相同的過期時間,導致在快取在同一時刻全部失效,造成瞬時db請求量大、壓力驟增,引起雪崩。

解決方案:

(1)redis高可用

這個思想的含義是,既然redis有可能掛掉,那我多增設幾台redis,這樣一台掛掉之後其他的還可以繼續工作,其實就是搭建的集群。

(2)限流降級

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

(3)資料預熱

資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。

概念:

乙個存在的key,在快取過期的一刻,同時有大量的請求,這些請求都會擊穿到db,造成瞬時db請求量大、壓力驟增。

解決方案:

在訪問key之前,採用setnx(set if not exists)命令來設定另乙個短期key來鎖住當前key的訪問,訪問結束再刪除該短期key。

業務層用分布式鎖鎖住查詢資料庫的**,直到有一條執行緒查詢出來了

Redis快取穿透 快取雪崩

把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下 一 快取和資料庫間資料一致性問題 分布式環境下 單機就不用說了 非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,...

Redis 快取穿透 快取雪崩

目錄 1.快取穿透 如何避免?如何選擇?2 快取擊穿 如何解決 3.快取雪崩 如何解決?快取穿透 一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力,或導致資料庫異常。...

redis快取穿透 快取雪崩

什麼是快取雪崩 在同一時間內大量的快取資料失效,大量的請求都會去資料庫查詢,造成快取雪崩。解決方法 這個沒有完美的解決方法,但是可以分析使用者行為,盡量讓失效時間點均勻分布,還有就是在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,比如對某國key只允許乙個執行緒查詢資料庫和快取,其他...