日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

更新時間: 2021-12-19 編程語言

緩存問題

1. 緩存穿透---查不到

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

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

解決方案

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

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

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

第二種方案:緩存空對象

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

存在問題:

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

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

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

解決方案

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

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

第二種方案:加互斥鎖

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

3. 緩存雪崩

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

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

解決方案

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

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

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

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

第三種方案:數據預熱

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

原文鏈接:https://blog.csdn.net/qq_45981295/article/details/121666465

欄目分類
最近更新