快取穿透問題
快取穿透是指查詢乙個根本不存在的資料,快取層和儲存層都不會命中,通常出
於容錯的考慮,如果從儲存層查不到資料則不寫入快取層。
一般對於未命中的資料我們是按照如下方式進行處理的:
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中沒有,也就是快取沒有命中,就向永續性資料庫發起查詢,發現資料庫也沒有這個資料,於是查詢失敗了。當使用者請求很多的情況下,快取沒有命中,資料庫也沒有數程式設計客棧據,會給資料庫造成很大的壓力,這就是快取穿透。解決方案 第一種解決方案 使用布隆過濾...