Redis中緩存穿透/擊穿/雪崩問題和解決方法
緩存問題
1. 緩存穿透—查不到
緩存穿透是指用戶想查詢一個數據,發現Redis中沒有,也就是緩存沒有命中,就向持久性數據庫發起查詢,發現數據庫也沒有這個數據,於是查詢失敗瞭。
當用戶請求很多的情況下,緩存沒有命中,數據庫也沒有數據,會給數據庫造成很大的壓力,這就是緩存穿透。
解決方案
第一種解決方案:使用佈隆過濾器
使用佈隆過濾器之後,將存儲的數據放入佈隆過濾器中,每次數據查詢首先查詢佈隆過濾器,當在過濾器中判斷存在時,再到緩存查詢,如果沒有,再進入數據查詢。
如果在佈隆過濾器中不存在,則直接返回告訴用戶該數據查不到,這樣能大大減輕數據庫查詢壓力。
第二種方案:緩存空對象
當數據庫數據不存在時,將返回的空對象緩存起來,同時設置一個過期時間,之後在訪問數據時,將從緩存中獲取,從而保護瞭數據庫。
存在問題:
對空值設置過期時間,會存在更新數據庫數據到緩存數據失效的這一段時間,緩存數據有問題(問題在於緩存的空對象數據,由於還沒有過期,但此時數據庫數據已經更新瞭),會對要保證數據一致性的業務造成影響。會需要更多的空間來存儲更多的控制,造成內存中有大量的空值的鍵。
2. 緩存擊穿—量太大,緩存過期
緩存擊穿是指一個熱點key,在不停的扛著大量的並發,當key在失效的瞬間,持續的大並發就會穿破緩存,直接請求到數據庫。對數據庫造成瞬間壓力過大。
解決方案
第一種方案:熱點數據永不過期
從緩存角度看,沒有設置過期時間,就不會存在緩存過期之後產生的問題。
第二種方案:加互斥鎖
使用分佈式鎖,保證對每個key的訪問同一時刻隻能一個線程去查詢後端服務,其他沒有獲取鎖權限的線程則等待即可。
3. 緩存雪崩
緩存雪崩是指在某一個時間段,緩存集中過期失效或者Redis宕機
對於數據庫而言,所有請求壓力會全部到達數據庫,導致數據庫調用量暴增,可能也造成數據庫宕機的情況
解決方案
第一種方案(預防為主):Redis采用高可用
這種方案的思路就是集群使用,即使一個redis掛掉,其他redis還可以繼續服務。
第二種方案(降低發生時所造成的危害):限流降級
這種思路就是在緩存失效後,通過加鎖或者隊列來控制讀取數據庫的線程數量讓線程在隊列排隊,控制整體請請求速率。
第三種方案:數據預熱
數據預熱即是在正式部署服務之前,先訪問一遍數據,可以將大部分的數據加載到緩存中,在即將發生大並發之前已經加載不同的key,設置不同的過期時間,讓緩存失效的時間更加均勻。
到此這篇關於Redis中緩存穿透/擊穿/雪崩問題和解決方法的文章就介紹到這瞭,更多相關Redis緩存穿透/擊穿/雪崩問題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!