redis學習···redis緩存穿透、緩存擊穿、緩存雪崩

一、緩存穿透

1、緩存處理流程 :

    前臺請求,後臺先從緩存中取數據,取到直接返回結果,取不到時從數據庫中取,
 同時數據庫取到更新緩存,並返回結果,數據庫也沒取到,那直接返回空結果。

流程如下圖:
在這裏插入圖片描述

2、緩存穿透概念:

	是指查詢一個數據庫一定不存在的數據。正常的使用緩存流程大致是:先進行緩存查詢,
如果key不存在或者key已經過期,再對數據庫進行查詢,並把查詢到的對象,放進緩存。
如果數據庫查詢對象爲空,則不放進緩存。

3、緩存穿透爲什麼需要解決

	舉例說明:數據庫 id 是從 1 開始的,結果黑客發過來的請求 id 全部都是負數。
這樣的話,緩存中不會有,請求每次都會直接越過緩存,直接查詢數據庫。這種惡意攻擊
場景的緩存穿透就會直接把數據庫給打死使數據庫宕機。

如下圖:
在這裏插入圖片描述
3、緩存穿透解決方案

    方案1:之所以會發生穿透,就是因爲緩存中沒有存儲這些空數據的key。從而導致
每次查詢都到數據庫去了。那麼我們就可以爲這些key對應的值設置爲null 
丟到緩存裏面去。後面再出現查詢這個key 的請求的時候,直接返回null 。
這樣,就不用在到數據庫中去走一圈了,但是別忘了設置過期時間。
    方案2:將數據庫中所有的查詢條件,放入布隆過濾器中,當一個查詢請求過來時,
先經過布隆過濾器進行查,如果判斷請求查詢值存在,則繼續查;如果判斷請求查詢
不存在,直接丟棄。

方案1:緩存空對象

當存儲層不命中後,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之後再訪問這個數據將會從緩存中獲取,保護了後端數據源;
在這裏插入圖片描述

但是這種方法會存在兩個問題:

1、如果空值能夠被緩存起來,這就意味着緩存需要更多的空間存儲更多的鍵,因爲這當中可能會有很多的空值的鍵;
2、即使對空值設置了過期時間,還是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對於需要保持一致性的業務會有影響。

方案2:布隆顧慮器:

布隆過濾器是一種數據結構,垃圾網站和正常網站加起來全世界據統計也有幾十億個。網警要過濾這些垃圾網站,總不能到數據庫裏面一個一個去比較吧,這就可以使用布隆過濾器。假設我們存儲一億個垃圾網站地址。

可以先有一億個二進制比特,然後網警用八個不同的隨機數產生器(F1,F2, …,F8) 產生八個信息指紋(f1, f2, …, f8)。接下來用一個隨機數產生器 G 把這八個信息指紋映射到 1 到1億中的八個自然數 g1, g2, …,g8。最後把這八個位置的二進制全部設置爲一。過程如下:
在這裏插入圖片描述

有一天網警查到了一個可疑的網站,想判斷一下是否是XX網站,首先將可疑網站通過哈希映射到1億個比特數組上的8個點。如果8個點的其中有一個點不爲1,則可以判斷該元素一定不存在集合中。

那這個布隆過濾器是如何解決redis中的緩存穿透呢?很簡單首先也是對所有可能查詢的參數以hash形式存儲,當用戶想要查詢的時候,使用布隆過濾器發現不在集合中,就直接丟棄,不再對持久層查詢。
在這裏插入圖片描述

這個形式很簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章