常見的Redis架構設計缺陷 快取穿透

2021-08-22 12:05:24 字數 704 閱讀 3757

什麼是快取穿透

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

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

常見場景

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

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

預防措施

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

1.快取空資料

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

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

2.布隆過濾器攔截

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

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

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

**:

架構設計常見的幾類問題

一 儲存系統的常見弊病 普通的儲存系統,往往存在 1 資料非高可用 2 單點寫入 的問題,解決的方 如何?二 儲存系統多點寫入問題 1 儲存系統能否支援多點寫入?2 多點寫入可能存在什麼問題?3 常見的解決方案是什麼?三 雜湊與雜湊的可逆性 1 由hash反推資料,是否可行?2 如何能夠得到 特定h...

架構設計開篇 架構設計的目標與衡量

程式設計即設計,即架構。架構,這個詞比較神秘,以致於很多程式設計師望而卻步,以為要什麼了不得的本事。確實的,架構設計是一種高遠的目標,但千里之行,始於足下。架構的目標是什麼呢?實現所需服務 架構,致力於以更低成本 更高效率 更高質量地實現所需服務。架構,是兼顧質量 效率與成本的魔法。但架構並不研究如...

Codis 分布式redis架構設計

codis是乙個分布式redis解決方案,與官方的純p2p的模式不同,codis採用的是proxy based的方案。今天我們介紹一下codis及下乙個大版本reborndb的設計,同時會介紹一些codis在實際應用場景中的tips。最後拋磚引玉,會介紹一下我對分布式儲存的一些觀點和看法,望各位首席...