1. 程式人生 > >常見的Redis架構設計缺陷

常見的Redis架構設計缺陷

什麼是快取穿透

所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。

過程:

快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作用,通常表現為伺服器負載迅速上升,嚴重時可能直接宕機。

常見場景

日常網站開發中,我們通常會將一些訪問頻繁的頁面快取起來,比如文章詳情頁、商品詳情頁等,而這些又恰恰是爬蟲最喜歡訪問的頁面,如果快取設計不合理,遇到不負責任的爬蟲,順著ID頻繁抓取資料,後果是非常嚴重的!

另外,有很多同學寫程式碼時不夠細心,特別是迴圈去呼叫某些介面時容易出現快取的情況,有時候威力堪比惡意攻擊(淚奔)。

預防措施

常見的兩種方法是快取空資料和使用布隆過濾器,需要根據實際場景進行選擇。

1.快取空資料

當第一次查詢資料庫時,若資料不存在,返回空資料時將其寫入快取,後續查詢就不必再去查詢資料庫了。

存在問題:如果key過期時間較長,出現惡意攻擊時,容易出現記憶體不夠的情況。另外,需要額外的業務邏輯處理資料庫與快取中資料一致性的問題。

2.布隆過濾器攔截

訪問快取之前,先從布隆過濾器中驗證資料是否存在。

簡單來講就是使用多個hash函式將一個key對映到一個很長的二進位制向量的多個位元位中,類似於hash set。

存在問題:維護複雜,建議只在海量資料的情況下使用。

轉自: