redis快取穿透和雪崩

2022-07-06 01:30:11 字數 2152 閱讀 7847

redis快取的使用,極大的提公升了應用程式的效能和效率,特別是資料查詢方面。但同時,它也帶來了一些問題,就是資料的一致性問題,從嚴格意義上來說,這個問題無解。如果對資料一致性要求很高,那麼就不能使用快取。

另外的一些典型問題就是,快取穿透、快取擊穿和快取雪崩。

快取穿透指的是訪問redis中的乙個不存在的key時,導致快取無法命中,每次請求都要穿透到資料庫中進行查詢,導致資料庫壓力過大,甚至掛掉。快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫帶來很大的壓力,這時候就相當於出現了快取穿透。

有很多方法有效地可以解決快取穿透問題,最常見的則是採用布隆過濾器,就是講所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個一定不存在的資料會被這個bitmap攔截,從而避免了對持久層資料庫的查詢壓力。

可以先有一億個二進位制位元,然後網警用8個不同的隨機數產生器(f1-f8)產生8個資訊指紋(f1-f8)。接下來有乙個隨機數產生器g把這8個資訊指紋對映到1到1億中的8個自然數g1-g8,最後把這8個位置的二進位制全部設定為1,過程如下:

有一天網警查到了乙個可疑的**,相判斷一下是否是xx**,首先將可疑的**對映到1億個位元陣列上的8個點,如果8個點的其中乙個點不為1,則可以判斷該元素一定不存在集合中。

那這個布隆過濾器是如何解決redis的快取穿透問題的呢?很簡單,首先也是對所有可能查詢到的引數以hash形式儲存,當使用者想要查詢的時候,使用布隆過濾器發現不在集合中,接直接丟棄,不在對持久層查詢。

另外也有乙個更為簡單粗暴的方法,如果乙個查詢返回的資料為空,仍然把這個空結果進行快取,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源。

但是這種方法會存在兩個問題:

快取擊穿,是指當某個key在過期的瞬間,有大量的請求併發訪問,這類資料一般是熱點資料,由於快取過期,會同時訪問持久層資料庫來查詢資料,並且寫回快取,會導致持久層資料庫瞬間壓力過大。

1. 設定熱點資料永不過期

「永不過期」包含兩層意思:從快取層面,確實沒有設定過期時間,所以不會出現熱點key過期後產生的問題,也就是「物理」不過期。從功能層面來看,為每個value設定乙個邏輯過期時間,當發現超過邏輯過期時間後,會使用單獨的執行緒去構建快取。

2. 加互斥鎖

分布式鎖:使用分布式鎖,保證對於每個key同時只有乙個執行緒去查詢後端服務,其他執行緒沒有獲得分布式鎖的許可權,因此只需要等待即可。這種方式將高併發的壓力轉移到了分布式鎖,因此對分布式鎖的考驗很大。

本地鎖:與分布式鎖類似,我們通過本地鎖的方式來限制只有乙個執行緒去持久層資料庫中查詢資料,而其他執行緒只需等待,等前面的執行緒查詢到資料後再訪問快取。但是,這種方式只能限制乙個服務節點只有乙個執行緒去持久層資料庫中查詢,如果乙個服務有多個節點,則還會有多個持久層資料庫查詢操作,也就是說在節點數量較多的情況下並沒有完全解決快取併發的問題。

快取雪崩是指快取層出現了問題,不能正常工作了或者在某一時間段,快取集中過期,或者資料資料未載入到快取中等情況下,導致所有的請求直接到達儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉。

1.  redis高可用

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

2. 限流降級

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

3. 資料預熱

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

Redis快取穿透和雪崩

快取的目的是什麼?提高效能,快取查詢的速度比去資料庫查詢要快。快取會分擔部分請求,減少併發壓力。那麼快取穿透是什麼?怎麼解決快取穿透呢?一般快取系統,按key去查詢value,如果不存在相應的key,那麼就會去資料庫查詢,如果key對應的value是一定不存在的,並且對key的併發查詢很高,那麼每次...

Redis 快取穿透和雪崩

快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時候就會繞過快取,每次都請求資料庫,這樣的話,大量的請求都直接到達資料庫,這種現象就叫快取穿透。list list demoservice.getdemodata demoid 防止...

Redis快取穿透和雪崩

服務的高可用問題 redis快取的使用,極大的提公升了應用程式的效能和效率,特別是資料查詢方面。但同時,它也帶來了一 些問題。其中,要害的問題,就是資料的一致性問題,從嚴格意義上講,這個問題無解。如果對資料 的一致性要求很高,那麼就不能使用快取。另外的一些典型問題就是,快取穿透 快取雪崩和快取擊穿。...