關于Redis的緩存穿透問題
1. 緩存穿透的理解
緩存穿透是指客戶端請求的數(shù)據在緩存中和數(shù)據庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數(shù)據庫。
2. 常見的解決方案有兩種:
- 1.緩存空對象
- 優(yōu)點:實現(xiàn)簡單,維護方便
- 缺點:
- 額外的內存消耗
- 可能造成短期的不一致
- 2.布隆過濾
- 優(yōu)點:內存占用較少,沒有多余key
- 缺點:
- 實現(xiàn)復雜
- 存在誤判可能
**緩存空對象思路分析:**當我們客戶端訪問不存在的數(shù)據時,先請求redis,但是此時redis中沒有數(shù)據,此時會訪問到數(shù)據庫,但是數(shù)據庫中也沒有數(shù)據,這個數(shù)據穿透了緩存,直擊數(shù)據庫,我們都知道數(shù)據庫能夠承載的并發(fā)不如redis這么高,如果大量的請求同時過來訪問這種不存在的數(shù)據,這些請求就都會訪問到數(shù)據庫,簡單的解決方案就是哪怕這個數(shù)據在數(shù)據庫中也不存在,我們也把這個數(shù)據存入到redis中去,這樣,下次用戶過來訪問這個不存在的數(shù)據,那么在redis中也能找到這個數(shù)據就不會進入到緩存了
3. 布隆過濾:
布隆過濾器其實采用的是哈希思想來解決這個問題,通過一個龐大的二進制數(shù)組,走哈希思想去判斷當前這個要查詢的這個數(shù)據是否存在,如果布隆過濾器判斷存在,則放行,這個請求會去訪問redis,哪怕此時redis中的數(shù)據過期了,但是數(shù)據庫中一定存在這個數(shù)據,在數(shù)據庫中查詢出來這個數(shù)據后,再將其放入到redis中,
假設布隆過濾器判斷這個數(shù)據不存在,則直接返回
這種方式優(yōu)點在于節(jié)約內存空間,存在誤判,誤判原因在于:布隆過濾器走的是哈希思想,只要哈希思想,就可能存在哈希沖突

4. 編碼解決查詢的緩存穿透問題:
核心思路如下:
在原來的邏輯中,我們如果發(fā)現(xiàn)這個數(shù)據在mysql中不存在,直接就返回404了,這樣是會存在緩存穿透問題的
現(xiàn)在的邏輯中:如果這個數(shù)據不存在,我們不會返回404 ,還是會把這個數(shù)據寫入到Redis中,并且將value設置為空,當再次發(fā)起查詢時,我們如果發(fā)現(xiàn)命中之后,判斷這個value是否是null,如果是null,則是之前寫入的數(shù)據,證明是緩存穿透數(shù)據,如果不是,則直接返回數(shù)據。

小總結:
緩存穿透產生的原因是什么?
- 用戶請求的數(shù)據在緩存中和數(shù)據庫中都不存在,不斷發(fā)起這樣的請求,給數(shù)據庫帶來巨大壓力
緩存穿透的解決方案有哪些?
- 緩存null值
- 布隆過濾
- 增強id的復雜度,避免被猜測id規(guī)律
- 做好數(shù)據的基礎格式校驗
- 加強用戶權限校驗
- 做好熱點參數(shù)的限流
相關文章
IDEA創(chuàng)建的maven項目中pom.xml增加新依賴無效問題及解決
在IDEA中,解決maven項目pom.xml增加依賴但外部庫未更新的問題,可以通過設置"構建腳本更改后同步項目"選項為"任何更改",然后刷新Maven項目來解決2025-01-01
SpringBoot創(chuàng)建RSocket服務器的全過程記錄
RSocket應用層協(xié)議支持 Reactive Streams語義, 例如:用RSocket作為HTTP的一種替代方案。這篇文章主要給大家介紹了關于SpringBoot創(chuàng)建RSocket服務器的相關資料,需要的朋友可以參考下2021-05-05
springboot swagger 接口文檔分組展示功能實現(xiàn)
這篇文章主要介紹了springboot swagger 接口文檔分組展示功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-03-03
使用Mybatis遇到的坑之Integer類型參數(shù)的解讀
這篇文章主要介紹了使用Mybatis遇到的坑之Integer類型參數(shù)的解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

