Redis中緩存穿透/擊穿/雪崩問題和解決方法

緩存問題

1. 緩存穿透—查不到

緩存穿透是指用戶想查詢一個數據,發現Redis中沒有,也就是緩存沒有命中,就向持久性數據庫發起查詢,發現數據庫也沒有這個數據,於是查詢失敗瞭。

當用戶請求很多的情況下,緩存沒有命中,數據庫也沒有數據,會給數據庫造成很大的壓力,這就是緩存穿透。

解決方案

第一種解決方案:使用佈隆過濾器

使用佈隆過濾器之後,將存儲的數據放入佈隆過濾器中,每次數據查詢首先查詢佈隆過濾器,當在過濾器中判斷存在時,再到緩存查詢,如果沒有,再進入數據查詢。

如果在佈隆過濾器中不存在,則直接返回告訴用戶該數據查不到,這樣能大大減輕數據庫查詢壓力。

第二種方案:緩存空對象

當數據庫數據不存在時,將返回的空對象緩存起來,同時設置一個過期時間,之後在訪問數據時,將從緩存中獲取,從而保護瞭數據庫。

存在問題:

對空值設置過期時間,會存在更新數據庫數據到緩存數據失效的這一段時間,緩存數據有問題(問題在於緩存的空對象數據,由於還沒有過期,但此時數據庫數據已經更新瞭),會對要保證數據一致性的業務造成影響。會需要更多的空間來存儲更多的控制,造成內存中有大量的空值的鍵。

2. 緩存擊穿—量太大,緩存過期

緩存擊穿是指一個熱點key,在不停的扛著大量的並發,當key在失效的瞬間,持續的大並發就會穿破緩存,直接請求到數據庫。對數據庫造成瞬間壓力過大。

解決方案

第一種方案:熱點數據永不過期

從緩存角度看,沒有設置過期時間,就不會存在緩存過期之後產生的問題。

第二種方案:加互斥鎖

使用分佈式鎖,保證對每個key的訪問同一時刻隻能一個線程去查詢後端服務,其他沒有獲取鎖權限的線程則等待即可。

3. 緩存雪崩

緩存雪崩是指在某一個時間段,緩存集中過期失效或者Redis宕機

對於數據庫而言,所有請求壓力會全部到達數據庫,導致數據庫調用量暴增,可能也造成數據庫宕機的情況

解決方案

第一種方案(預防為主):Redis采用高可用

這種方案的思路就是集群使用,即使一個redis掛掉,其他redis還可以繼續服務。

第二種方案(降低發生時所造成的危害):限流降級

這種思路就是在緩存失效後,通過加鎖或者隊列來控制讀取數據庫的線程數量讓線程在隊列排隊,控制整體請請求速率。

第三種方案:數據預熱

數據預熱即是在正式部署服務之前,先訪問一遍數據,可以將大部分的數據加載到緩存中,在即將發生大並發之前已經加載不同的key,設置不同的過期時間,讓緩存失效的時間更加均勻。

到此這篇關於Redis中緩存穿透/擊穿/雪崩問題和解決方法的文章就介紹到這瞭,更多相關Redis緩存穿透/擊穿/雪崩問題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: