首頁  >  文章  >  資料庫  >  redis緩存穿透怎麼解決

redis緩存穿透怎麼解決

步履不停
步履不停原創
2019-06-22 17:52:4010515瀏覽

redis緩存穿透怎麼解決

快取技術可以用來減輕資料庫的壓力,提升存取效率。目前在企業專案中對快取也是越來越重視。但是快取不是說隨便加入專案就可以了。將快取整合到專案中,這才是第一步。而緩存帶來的穿透問題,進而導致的雪蹦問題都是我們迫切需要解決的問題。這篇文章將我平時專案中的解決方案分享給大家,以供參考。

一、快取穿透的原理

快取的正常使用如圖:

redis緩存穿透怎麼解決

如圖所示,快取的使用流程:

1、先從快取取數據,如果能取到,直接回傳資料給使用者。這樣不用存取資料庫,減輕資料庫的壓力。

2、如果快取中沒有數據,就會存取資料庫。

這裡面就會存在一個BUG,如圖:

redis緩存穿透怎麼解決

#如圖,快取就像是資料庫的一道防火牆,將請求比較頻繁的數據放到快取中,從而減輕資料庫的壓力。但是如果有人惡意攻擊,那就很輕鬆的穿透你的緩存,將所有的壓力都給資料庫。例如上圖,你快取的key都是正整數,但是我偏偏使用負數作為key存取你的緩存,這樣就會導致穿透緩存,將壓力直接給資料庫。

二、導致快取穿透的原因

快取穿透的問題,肯定是再大並發情況下。依此為前提,我們分析快取穿透的原因如下:

1、惡意攻擊,猜測你的key命名方式,然後估計使用一個你快取中不會有的key進行存取。

2、第一次數據訪問,這時快取中還沒有數據,則並發場景下,所有的請求都會壓到資料庫。

3、資料庫的資料也是空,這樣即使存取了資料庫,也是取得不到數據,那麼快取中肯定也沒有對應的資料。這樣也會導致穿透。

三、解決快取穿透

快取穿透在於一步步規避穿透的原因,如圖:

redis緩存穿透怎麼解決

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

  • 1、再web伺服器啟動時,提前將有可能被頻繁並發存取的資料寫入快取。 —這樣就規避大量的請求在第3步出現排隊阻塞。

  • 2、規範key的命名,並且統一快取查詢和寫入的入口。這樣,在入口處,對key的規範進行檢測。 –這樣保存惡意的key被攔截。

  • 3、Synchronized雙重偵測機制,這時我們需要使用同步(Synchronized)機制,在同步程式碼區塊前查詢快取是否存在對應的key,然後同步程式碼區塊裡面再次查詢快取裡是否有要查詢的key。 這樣「雙重偵測」的目的,還是避免並發場景下導致的沒有意義的資料庫的存取(也是嚴格避免穿透的方案)。

    這一步會導致排隊,但是第一步中我們說過,為了避免大量的排隊,可以提前將可以預知的大量請求提前寫入快取。

  • 4、不管資料庫中是否有數據,都在快取中保存對應的key,值為空就行。 –這樣是為了避免資料庫中沒有這個數據,導致的平凡穿透快取對資料庫進行存取。

  • 5、第4步中的空值如果太多,也會導致記憶體耗盡。導致不必要的記憶體消耗。這樣就要定期的清理空值的key。避免記憶體被惡意佔滿。導致正常的功能不能快取資料。

更多Redis相關技術文章,請造訪Redis教學##欄位進行學習!

以上是redis緩存穿透怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn