redis緩存穿透的解決方法

這篇文章主要介紹redis緩存穿透的解決方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

在萊山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷,成都外貿(mào)網(wǎng)站建設(shè),萊山網(wǎng)站建設(shè)費(fèi)用合理。

緩存技術(shù)可以用來減輕數(shù)據(jù)庫的壓力,提升訪問效率。目前在企業(yè)項(xiàng)目中對(duì)緩存也是越來越重視。但是緩存不是說隨隨便便加入項(xiàng)目就可以了。將緩存整合到項(xiàng)目中,這才是第一步。而緩存帶來的穿透問題,進(jìn)而導(dǎo)致的雪蹦問題都是我們迫切需要解決的問題。本篇文章將我平時(shí)項(xiàng)目中的解決方案分享給大家,以供參考。

一、緩存穿透的原理

緩存的正常使用如圖:

redis緩存穿透的解決方法

如圖所示,緩存的使用流程:

1、先從緩存中取數(shù)據(jù),如果能取到,則直接返回?cái)?shù)據(jù)給用戶。這樣不用訪問數(shù)據(jù)庫,減輕數(shù)據(jù)庫的壓力。

2、如果緩存中沒有數(shù)據(jù),就會(huì)訪問數(shù)據(jù)庫。

這里面就會(huì)存在一個(gè)BUG,如圖:

redis緩存穿透的解決方法

如圖,緩存就像是數(shù)據(jù)庫的一道防火墻,將請(qǐng)求比較頻繁的數(shù)據(jù)放到緩存中,從而減輕數(shù)據(jù)庫的壓力。 但是如果有人惡意攻擊,那就很輕松的穿透你的緩存,將所有的壓力都給數(shù)據(jù)庫。比如上圖,你緩存的key都是正整數(shù),但是我偏偏使用負(fù)數(shù)作為key訪問你的緩存,這樣就會(huì)導(dǎo)致穿透緩存,將壓力直接給數(shù)據(jù)庫。

二、導(dǎo)致緩存穿透的原因

緩存穿透的問題,肯定是再大并發(fā)情況下。依此為前提,我們分析緩存穿透的原因如下:

1、惡意攻擊,猜測(cè)你的key命名方式,然后估計(jì)使用一個(gè)你緩存中不會(huì)有的key進(jìn)行訪問。

2、第一次數(shù)據(jù)訪問,這時(shí)緩存中還沒有數(shù)據(jù),則并發(fā)場(chǎng)景下,所有的請(qǐng)求都會(huì)壓到數(shù)據(jù)庫。

3、數(shù)據(jù)庫的數(shù)據(jù)也是空,這樣即使訪問了數(shù)據(jù)庫,也是獲取不到數(shù)據(jù),那么緩存中肯定也沒有對(duì)應(yīng)的數(shù)據(jù)。這樣也會(huì)導(dǎo)致穿透。

三、解決緩存穿透

緩存穿透在于一步步規(guī)避穿透的原因,如圖:

redis緩存穿透的解決方法

如上圖所示,解決的步驟如下:

  • 1、再web服務(wù)器啟動(dòng)時(shí),提前將有可能被頻繁并發(fā)訪問的數(shù)據(jù)寫入緩存?!@樣就規(guī)避大量的請(qǐng)求在第3步出現(xiàn)排隊(duì)阻塞。

  • 2、規(guī)范key的命名,并且統(tǒng)一緩存查詢和寫入的入口。這樣,在入口處,對(duì)key的規(guī)范進(jìn)行檢測(cè)。–這樣保存惡意的key被攔截。

  • 3、Synchronized雙重檢測(cè)機(jī)制,這時(shí)我們就需要使用同步(Synchronized)機(jī)制,在同步代碼塊前查詢一下緩存是否存在對(duì)應(yīng)的key,然后同步代碼塊里面再次查詢緩存里是否有要查詢的key。  這樣“雙重檢測(cè)”的目的,還是避免并發(fā)場(chǎng)景下導(dǎo)致的沒有意義的數(shù)據(jù)庫的訪問(也是一種嚴(yán)格避免穿透的方案)。

    這一步會(huì)導(dǎo)致排隊(duì),但是第一步中我們說過,為了避免大量的排隊(duì),可以提前將可以預(yù)知的大量請(qǐng)求提前寫入緩存。

  • 4、不管數(shù)據(jù)庫中是否有數(shù)據(jù),都在緩存中保存對(duì)應(yīng)的key,值為空就行。–這樣是為了避免數(shù)據(jù)庫中沒有這個(gè)數(shù)據(jù),導(dǎo)致的平凡穿透緩存對(duì)數(shù)據(jù)庫進(jìn)行訪問。

  • 5、第4步中的空值如果太多,也會(huì)導(dǎo)致內(nèi)存耗盡。導(dǎo)致不必要的內(nèi)存消耗。這樣就要定期的清理空值的key。避免內(nèi)存被惡意占滿。導(dǎo)致正常的功能不能緩存數(shù)據(jù)。

以上是redis緩存穿透的解決方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前名稱:redis緩存穿透的解決方法
分享URL:http://bm7419.com/article2/pcodoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、建站公司、網(wǎng)站維護(hù)網(wǎng)站策劃、網(wǎng)站改版、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)