Redis 快取穿透問題及解決方案

2021-10-19 23:31:32 字數 2441 閱讀 7480

快取穿透問題

快取穿透是指查詢乙個根本不存在的資料,快取層和儲存層都不會命中,通常出

於容錯的考慮,如果從儲存層查不到資料則不寫入快取層。

一般對於未命中的資料我們是按照如下方式進行處理的:

1.快取層不命中。

2.儲存層不命中,不將空結果寫回快取。

3.返回空結果。

/**

* 快取穿透問題

* 在資料庫中未查找到資料,未存入快取,則下次查詢同樣的資料時,還會查庫

* @param id

* @return

*/public object getobjectbyid(integer id)

object storagevalue = storage.get(id);

if(null != storagevalue)

return storagevalue;

}

快取穿透將導致不存在的資料每次請求都要到儲存層去查詢,失去了快取保護後

端儲存的意義。

快取穿透問題可能會使後端儲存負載加大,由於很多後端儲存不具備高併發性,

甚至可能造成後端儲存宕掉。

方案一:快取空物件

/**

* 快取空物件

* 此方法存在漏洞,不經判斷就直接將null存入快取中,如果惡意製造不存在的id,那麼快取中的鍵值就會很多,

* 惡意攻擊時很可能被打爆,因此需要設定較短的過期時間

* @param id

* @return

*/public object getobjectbyid(integer id)

object storagevalue = storage.get(id);

cache.set(id,storagevalue);

//若資料為空,則必須設定過期時間,否則有被攻擊的風險

if(null == storagevalue)

return storagevalue;

}

快取空物件會有乙個必須考慮的問題:

空值做了快取,意味著快取層中存了更多的鍵,需要更多的記憶體空間(如果是攻

擊,問題更嚴重),比較有效的方法是針對這類資料設定乙個較短的過期時間,

讓其自動剔除。

方案二:布隆過濾器攔截

布隆過濾器介紹

概念:布隆過濾器(英語:bloom filter)是 1970 年由布隆提出的。它實際上是乙個很

長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否

在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是

有一定的誤識別率和刪除困難。

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存

起來,然後通過比較確定。鍊錶、樹、雜湊表(又叫雜湊表,hash table)等等

資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來

越大。同時檢索速度也越來越慢,上述三種結構的檢索時間複雜度分別為

o(n),o(log n),o(n/k)。

布隆過濾器的原理是,當乙個元素被加入集合時,通過 k 個雜湊函式將這個元

素對映成乙個位陣列中的 k 個點,把它們置為 1。檢索時,我們只要看看這些點

是不是都是 1 就(大約)知道集合中有沒有它了:如果這些點有任何乙個 0,則

被檢元素一定不在;如果都是 1,則被檢元素很可能在。這就是布隆過濾器的基

本思想。

示例:

public class booleanfiltertest 

}/**

* id是否合法有效,即校驗id是否在過濾器中

* @param id

* @return

*/private static boolean validateidinbloomfilter(integer id)

}

布隆過濾器攔截

設定過期時間,讓其自動過期失效,這種在很多時候不是最佳的實踐方案。

我們可以提前將真實正確的商品 id,在新增完成之後便加入到過濾器當中,每次

再進行查詢時,先確認要查詢的 id 是否在過濾器當中,如果不在,則說明 id 為

非法 id,則不需要進行後續的查詢步驟了。

/**

* 防止快取穿透:布隆過濾器

* @param id

* @return

*/public object getobjectbyboolean(integer id)

object cachevalue = cache.get(id);

if(null != cachevalue)else

}

摘自《咕泡學院》學習檔案

Redis快取擊穿,穿透,雪崩等問題,及解決方案

快取穿透是指查詢乙個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。有很多種方法可以有效地...

Redis快取穿透 快取擊穿 快取雪崩 解決方案

快取穿透 不斷請求快取和資料庫中都沒有的資料。黑客可以通過快取穿透使資料庫負載過大被壓垮,資料庫伺服器宕機。解決方案 校驗請求。如使用者id小於0,直接返回使用者不存在。設定key的value為 null 有效時長設定較小值,如30秒,防止資料庫中插入了資料,但快取不及時更新。利用布隆過濾器判斷請求...

Redis中快取穿透 擊穿 雪崩問題和解決方法

目錄 快取穿透是指使用者想查詢乙個資料,發現redis中沒有,也就是快取沒有命中,就向永續性資料庫發起查詢,發現資料庫也沒有這個資料,於是查詢失敗了。當使用者請求很多的情況下,快取沒有命中,資料庫也沒有數程式設計客棧據,會給資料庫造成很大的壓力,這就是快取穿透。解決方案 第一種解決方案 使用布隆過濾...