redis緩存穿透00

緩存穿透數據庫

緩存穿透,是指查詢一個數據庫必定不存在的數據。正常的使用緩存流程大體是,數據查詢先進行緩存查詢,若是key不存在或者key已通過期,再對數據庫進行查詢,並把查詢到的對象,放進緩存。若是數據庫查詢對象爲空,則不放進緩存。緩存

 

一,設置一個默認值,簡單粗暴:spa

若是查詢數據庫也爲空,直接設置一個默認值存放到緩存,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問數據庫,這種辦法最簡單粗暴。對象

代碼流程it

1.參數傳入對象主鍵IDclass

2.根據key從緩存中獲取對象數據

3.若是對象不爲空,直接返回查詢

4.若是對象爲空,進行數據庫查詢時間

5.若是從數據庫查詢出的對象不爲空,則放入緩存(設定過時時間)工作

想象一下這個狀況,若是傳入的參數爲-1,會是怎麼樣?這個-1,就是必定不存在的對象。就會每次都去查詢數據庫,而每次查詢都是空,每次又都不會進行緩存。假若有惡意攻擊,就能夠利用這個漏洞,對數據庫形成壓力,甚至壓垮數據庫。即使是採用UUID,也是很容易找到一個不存在的KEY,進行攻擊。我在工做中,會採用緩存空值的方式,也就是【代碼流程】中第5步,若是從數據庫查詢的對象爲空,也放入緩存,只是設定的緩存過時時間較短,好比設置爲60秒。

 

 

 2、根據緩存數據Key的規則。例如機頂盒的,緩存數據以Mac爲Key,Mac是有規則,若是不符合規則就過濾掉,這樣能夠過濾一部分查詢。在作緩存規劃的時候,Key有必定規則的話,能夠採起這種辦法。這種辦法只能緩解一部分的壓力,過濾和系統無關的查詢,可是沒法根治。

 

 

3、採用布隆過濾器,將全部可能存在的數據哈希到一個足夠大的BitSet中,不存在的數據將會被攔截掉,從而避免了對底層存儲系統的查詢壓力。關於布隆過濾器,詳情查看:基於BitSet的布隆過濾器(Bloom Filter)

 

注:大的緩存穿透,會致使緩存雪崩。

相關文章
相關標籤/搜索