天天看點

Redis:緩存擊穿,穿透和雪崩

Redis緩存的使用,極大的提升了應用程式的性能和效率,特别是資料查詢方面,但同時,它也帶來了一些問題,其中,最要害的問題,就是資料一緻性的問題,從嚴格意義上講,這個問題無解,如果對資料的一緻性要求很高,那麼就不能使用緩存

緩存穿透的概念很簡單,使用者要查詢一個資料,發現redis記憶體資料庫沒有,也就是緩存沒有命中,于是想持久層查詢,發現也沒有,此類現象稱為緩存穿透

後果:當大量的讀請求緩存都沒有命中,于是都請求了資料庫,這會給持久層資料庫造成很大壓力,甚至造成伺服器挂掉

布隆過濾器是一種資料結構,對所有可能查詢的參數以hash形式存儲,存儲所有有資料的key,這樣就可以在讀請求通路的時候先通過布隆過濾器去判斷目前資料庫是否有對應的值,有則傳回資料的位置位址,無則傳回null

問題:由于布隆過濾器沒有删除相關操作,那麼當資料庫已經删除key時,布隆裡依舊會存在,是以可以對應那些删除的key在緩存中存儲null,

Redis:緩存擊穿,穿透和雪崩

當緩存不命中時(就是說經過過濾器,給他傳回null),那麼也給他緩存起來,之後在通路這個資料就會從緩存中擷取,保護了後端資料源。,一般會給這種key設定過期時間

Redis:緩存擊穿,穿透和雪崩

 面臨的問題:

(1)如果空值被緩存起來,那麼就意味着要需要更多的鍵去存儲沒用的空值,占用空間浪費資源

(2)即使對空值的資料設定看過期時間,還是會存在緩存層和存儲層的資料會有一段時間視窗不一緻,對于需要保持一緻性的業務會有影響

經典例子:微網誌伺服器當機

指一個key非常熱點,在不停扛着大并發,大并發集中一個點進行通路,當這個key失效的瞬間(key過期了),持續大并發就會穿破緩存,直接通路存儲層,查到後回寫至緩存,但這個讀請求是一個持續的高并發的,這就會給資料庫瞬間帶來很多壓力,設定導緻資料庫崩掉,導緻背景一個接着一個的服務垮掉,猶如雪崩一般

1,設定熱點永不過期

2,賈互斥鎖,就是給key加分布式鎖,保證每個key同時隻有一個線程在查詢背景服務

緩存雪崩指的是短時間内,緩存中有大量的key幾種過期,此周期内請求通路呢過期的資料,redis均為命中,于是向資料庫擷取資料,資料庫同時收到大量的請求無法及時處理,造成redis大量請求被積壓,開始出現了逾時現象,資料庫同時壓力劇增,面臨崩潰。

(1)redis伺服器資源被嚴重占用,redis伺服器崩潰;

(2)redis叢集呈現崩塌,叢集瓦解;

(3)應用伺服器無法及時得到資料響應的請求,來自用戶端的請求數量越來越多,應用伺服器奔潰;

(4)應用伺服器,redis,資料庫全部重新開機,效果不理想。

(1)服務降級:短期内将不重要的服務停掉,節省下來的資源全部交給重要的服務

(2)資料預熱:就是在開放服務之前先将服務預期要面臨的問題先測試一遍,提前做好準備

(3)Redis高可用:異地多活,多加幾台redis

繼續閱讀