快取擊穿 快取穿透和快取雪崩

2021-09-22 20:04:24 字數 904 閱讀 2740

快取擊穿

定義: 快取中的key一般設有過期時間,如果某個key過期了,恰在這個時候,有大量的併發請求訪問這個key,則這些請求都會到達db,導致db瞬間壓力過大,壓垮db。

解決方案: 1.設定互斥鎖,mutex。當快取失效時不時立即去訪問資料庫,而是使用快取工具的操作成功帶返回值的操作,比如redis的setnx(set if not exists),memcache的add,利用setnx實現鎖的效果。

缺點:可能造成死鎖,或執行緒池阻塞

2.提前使用互斥鎖

redist的超時時間是timeout1,value的超時時間是timeout2,timeout2 < timeout1。 當timeout2超時時,延長timeout2的時間。並重新設定到redis中。

3.永遠不過期

不設定過期時間。

把過期時間設到value裡,如果快要過期了,通過乙個後台非同步執行緒進行快取的構建,也就是邏輯過期。

快取穿透

定義: 指有人用資料庫中不存在的某個key訪問,資料庫中沒有該key值,自然快取中也不會有,該請求會直接到資料庫。如果對該key的併發訪問量過大,則會壓垮資料庫。

解決方案:

採用過濾器,把所有資料庫中不可能存在的資料hash到一張大的bitmap中,如果key在資料庫中不存在,將會被bitmap攔截。

對查出為空的key,也在快取中簡歷key value對,只是過期時間設的短一點,比如5minetes。

快取雪崩

定義: 指快取中大量的資料在同一時間失效,這時有大量的請求會被直接轉到資料庫,造成資料庫的壓力過大。

解決方案:1. 加鎖,加佇列,如mq,保證快取的單執行緒寫,避免key失效時,大量併發到達資料庫。

2.把快取失效時間錯開。比如在原有失效時間上加乙個隨機值,比如1-5分鐘,這樣失效時間的重複率降低,降低集體失效的概率。

快取穿透,快取雪崩和快取擊穿

q 快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。a 1.布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個...

快取穿透 快取雪崩和快取擊穿

快取系統是我們平時開發經常使用到的,也是在高併發場景下減少或防止流量對db等底層系統衝擊的最有效手段之一。下面就簡單談談快取系統經常提及的三個問題以及解決方案。首先回憶下通常情況我們設定的快取機制,如下圖所示 快取載入機制 這套機制,由於出於容錯考慮,從儲存層查不到資料則不寫入快取,這就導致每次請求...

快取穿透 快取雪崩和快取擊穿

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