如何應對快取三大問題

2021-10-24 12:52:11 字數 1498 閱讀 1638

快取擊穿

首先我們來看下請求是如何取到資料的:當接收到使用者請求,首先先嘗試從redis快取中獲取到資料,如果快取中能取到資料則直接返回結果,當快取中不存在資料時從db獲取資料,如果資料庫成功取到資料,則更新redis,然後返回資料

定義:

高併發的情況下,某個熱門key突然過期,導致大量請求在redis未找到快取資料,進而全部去訪問db請求資料,引起db壓力瞬間增大。

解決方案:

redis中的資料不設定過期時間,然後在快取的物件上新增乙個屬性標識過期時間,每次獲取到資料時,校驗物件中的過期時間屬性,如果資料即將過期,則非同步發起乙個執行緒主動更新快取中的資料。但是這種方案可能會導致有些請求會拿到過期的值,就得看業務能否可以接受

如果要求資料必須是新資料,則最好的方案則為熱點資料設定為永不過期,然後加乙個互斥鎖保證快取的單執行緒寫。

快取穿透

定義:

快取穿透是指查詢快取和db中都不存在的資料。比如通過id查詢商品資訊,id一般大於0,攻擊者會故意傳id為-1去查詢,由於快取是不命中則從db中獲取資料,這將會導致每次快取都不命中資料導致每個請求都訪問db,造成快取穿透。

解決方案:

利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了,再去請求資料庫。沒得到鎖,則休眠一段時間重試

採用非同步更新策略,無論key是否取到值,都直接返回。value值中維護乙個快取失效時間,快取如果過期,非同步起乙個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。

提供乙個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的key是否合法有效。如果不合法,則直接返回。

如果從資料庫查詢的物件為空,也放入快取,只是設定的快取過期時間較短,比如設定為60秒。

快取雪崩

定義:

快取中如果大量快取在一段時間內集中過期了,這時候會發生大量的快取擊穿現象,所有的求都落在了db上,由於查詢資料量巨大,引起db壓力過大甚至導致db宕機。

解決方案:

給快取的失效時間,加上乙個隨機值,避免集體失效。如果redis是集群部署,將熱點資料均勻分布在不同的redis庫中也能避免全部失效的問題

使用互斥鎖,但是該方案吞吐量明顯下降了。

設定熱點資料永遠不過期。

雙快取。我們有兩個快取,快取a和快取b。快取a的失效時間為20分鐘,快取b不設失效時間。自己做快取預熱操作。然後細分以下幾個小點:

1. 從快取a讀資料庫,有則直接返回

2. a沒有資料,直接從b讀資料,直接返回,並且非同步啟動乙個更新執行緒。

3. 更新執行緒同時更新快取a和快取b。

快取常見三大問題

之前常聽人說,但是沒有仔細想過這些問題。最近看 可伸縮服務架構 架構與中介軟體 中這些問題解釋的很好,也給出了一般解決方案,記錄一下。快取穿透 快取併發 快取雪崩常見的由於併發量大而導致。說明 快取穿透指的是使用不存在的key進行大量的高併發查詢,這導致快取無法命中,每次請求都要穿透到後端資料庫系統...

快取三大問題再總結

快取三大問題再總結 1 快取穿透 定義 快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時需要從資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,進而給db帶來壓力。解決 方案一 快取空資料 優點 簡單 缺點 效果不好 1 第一次查詢需要查庫 2 如果換另...

Redis快取三大問題解析

通俗來講,快取粒度問題就是我們在使用快取時,是將所有資料快取還是快取部分資料?快取粒度問題是乙個容易被忽視的問題,如果使用不當,可能會造成很多無用空間的浪費,可能會造成網路頻寬的浪費,可能會造成 通用性較差等情況,必須學會綜合資料通用性 空間占用比 維護性 三點評估取捨因素權衡使用。快取穿透是指查詢...