關(guān)于Redis的緩存穿透問(wèn)題
1. 緩存穿透的理解
緩存穿透是指客戶端請(qǐng)求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫(kù)中都不存在,這樣緩存永遠(yuǎn)不會(huì)生效,這些請(qǐng)求都會(huì)打到數(shù)據(jù)庫(kù)。
2. 常見(jiàn)的解決方案有兩種:
- 1.緩存空對(duì)象
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,維護(hù)方便
- 缺點(diǎn):
- 額外的內(nèi)存消耗
- 可能造成短期的不一致
- 2.布隆過(guò)濾
- 優(yōu)點(diǎn):內(nèi)存占用較少,沒(méi)有多余key
- 缺點(diǎn):
- 實(shí)現(xiàn)復(fù)雜
- 存在誤判可能
**緩存空對(duì)象思路分析:**當(dāng)我們客戶端訪問(wèn)不存在的數(shù)據(jù)時(shí),先請(qǐng)求redis,但是此時(shí)redis中沒(méi)有數(shù)據(jù),此時(shí)會(huì)訪問(wèn)到數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)中也沒(méi)有數(shù)據(jù),這個(gè)數(shù)據(jù)穿透了緩存,直擊數(shù)據(jù)庫(kù),我們都知道數(shù)據(jù)庫(kù)能夠承載的并發(fā)不如redis這么高,如果大量的請(qǐng)求同時(shí)過(guò)來(lái)訪問(wèn)這種不存在的數(shù)據(jù),這些請(qǐng)求就都會(huì)訪問(wèn)到數(shù)據(jù)庫(kù),簡(jiǎn)單的解決方案就是哪怕這個(gè)數(shù)據(jù)在數(shù)據(jù)庫(kù)中也不存在,我們也把這個(gè)數(shù)據(jù)存入到redis中去,這樣,下次用戶過(guò)來(lái)訪問(wèn)這個(gè)不存在的數(shù)據(jù),那么在redis中也能找到這個(gè)數(shù)據(jù)就不會(huì)進(jìn)入到緩存了
3. 布隆過(guò)濾:
布隆過(guò)濾器其實(shí)采用的是哈希思想來(lái)解決這個(gè)問(wèn)題,通過(guò)一個(gè)龐大的二進(jìn)制數(shù)組,走哈希思想去判斷當(dāng)前這個(gè)要查詢的這個(gè)數(shù)據(jù)是否存在,如果布隆過(guò)濾器判斷存在,則放行,這個(gè)請(qǐng)求會(huì)去訪問(wèn)redis,哪怕此時(shí)redis中的數(shù)據(jù)過(guò)期了,但是數(shù)據(jù)庫(kù)中一定存在這個(gè)數(shù)據(jù),在數(shù)據(jù)庫(kù)中查詢出來(lái)這個(gè)數(shù)據(jù)后,再將其放入到redis中,
假設(shè)布隆過(guò)濾器判斷這個(gè)數(shù)據(jù)不存在,則直接返回
這種方式優(yōu)點(diǎn)在于節(jié)約內(nèi)存空間,存在誤判,誤判原因在于:布隆過(guò)濾器走的是哈希思想,只要哈希思想,就可能存在哈希沖突
4. 編碼解決查詢的緩存穿透問(wèn)題:
核心思路如下:
在原來(lái)的邏輯中,我們?nèi)绻l(fā)現(xiàn)這個(gè)數(shù)據(jù)在mysql中不存在,直接就返回404了,這樣是會(huì)存在緩存穿透問(wèn)題的
現(xiàn)在的邏輯中:如果這個(gè)數(shù)據(jù)不存在,我們不會(huì)返回404 ,還是會(huì)把這個(gè)數(shù)據(jù)寫(xiě)入到Redis中,并且將value設(shè)置為空,當(dāng)再次發(fā)起查詢時(shí),我們?nèi)绻l(fā)現(xiàn)命中之后,判斷這個(gè)value是否是null,如果是null,則是之前寫(xiě)入的數(shù)據(jù),證明是緩存穿透數(shù)據(jù),如果不是,則直接返回?cái)?shù)據(jù)。
小總結(jié):
緩存穿透產(chǎn)生的原因是什么?
- 用戶請(qǐng)求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫(kù)中都不存在,不斷發(fā)起這樣的請(qǐng)求,給數(shù)據(jù)庫(kù)帶來(lái)巨大壓力
緩存穿透的解決方案有哪些?
- 緩存null值
- 布隆過(guò)濾
- 增強(qiáng)id的復(fù)雜度,避免被猜測(cè)id規(guī)律
- 做好數(shù)據(jù)的基礎(chǔ)格式校驗(yàn)
- 加強(qiáng)用戶權(quán)限校驗(yàn)
- 做好熱點(diǎn)參數(shù)的限流
相關(guān)文章
Java線程狀態(tài)轉(zhuǎn)換關(guān)系實(shí)例解析
這篇文章主要介紹了Java線程狀態(tài)轉(zhuǎn)換關(guān)系實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08eclipse自動(dòng)提示和自動(dòng)補(bǔ)全功能實(shí)現(xiàn)方法
這篇文章主要介紹了eclipse自動(dòng)提示和自動(dòng)補(bǔ)全的相關(guān)內(nèi)容,文中向大家分享了二者的實(shí)現(xiàn)方法代碼,需要的朋友可以了解下。2017-09-09基于Jpa中ManyToMany和OneToMany的雙向控制
這篇文章主要介紹了Jpa中ManyToMany和OneToMany的雙向控制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java開(kāi)發(fā)RocketMQ之NameServer路由管理源碼分析
這篇文章主要為大家介紹了java開(kāi)發(fā)中RocketMQ之NameServer路由管理源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11Spring?IOC?xml方式進(jìn)行工廠Bean操作詳解
這篇文章主要介紹了Spring?IOC?xml方式進(jìn)行工廠Bean操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01Springboot中spring-boot-starter-quartz的使用及說(shuō)明
這篇文章主要介紹了Springboot中spring-boot-starter-quartz的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12java 獲取request中的請(qǐng)求參數(shù)代碼詳解
這篇文章主要介紹了java 獲取request中的請(qǐng)求參數(shù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05