使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)


3樓貓 發佈時間:2024-11-26 18:55:18 作者:義眼鼎針找石磚家 Language

CSDN文章鏈接;https://blog.csdn.net/hrh1234h/article/details/144024554?sharetype=blogdetail&sharerId=144024554&sharerefer=WAP&sharesource=2402_89228704

目錄

什麼是緩存,緩存有什麼作用

什麼是緩存穿透問題

布隆過濾器解決緩存穿透問題

什麼是布隆過濾器

布隆過濾器解決緩存穿透的思路

使用布隆過濾器(Redisson內集成了Bloom Filter)

引入依賴

配置Redisson客戶端

創建布隆過濾器,配置過濾器屬性

使用布隆過濾器

布隆過濾器原理深入解讀

布隆過濾器的數據結構

手搓布隆過濾器

布隆過濾器的優缺點總結

優點

缺點

——————————————

什麼是緩存,緩存有什麼作用

緩存通常用於存儲經常訪問的數據,以便快速檢索,減少對原始數據源的直接訪問需求。通過存儲頻繁訪問的數據,緩存可以減少對後端數據庫或服務的請求,從而減輕它們的負載。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第0張

什麼是緩存穿透問題

如果查詢一個不存在的數據,數據庫查詢不到數據也不會直接寫入緩存,就會導致每次請求都查數據庫,相當於緩存失效,如果這種請求很多,尤其是惡意攻擊時,會對數據庫造成很大的壓力,甚至可能導致數據庫服務不可用。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第1張

布隆過濾器解決緩存穿透問題

什麼是布隆過濾器

布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

布隆過濾器解決緩存穿透的思路

在系統啟動或定期更新時,將數據庫中已經存在的所有鍵,這樣,布隆過濾器就包含了所有合法的鍵。請求到達緩存前先在布隆過濾器預檢查,如果布隆過濾器判斷該鍵可能不存在,則直接返回請求不存在的結果,不再進行後續的緩存和數據庫查詢。如果布隆過濾器判斷該鍵可能存在,則繼續進行後續操作。

使用布隆過濾器(Redisson內集成了Bloom Filter)

引入依賴

Redisson內集成了布隆過濾器,我們可以直接使用Redisson。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第2張

配置Redisson客戶端

配置Redisson客戶端,連接到Redis服務器。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張

創建布隆過濾器,配置過濾器屬性

使用Redisson創建一個布隆過濾器,並初始化其容量和誤判率。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張

使用布隆過濾器

在查詢緩存之前,先使用布隆過濾器檢查數據是否存在。如果布隆過濾器返回不存在,則直接返回默認值或錯誤信息,避免查詢數據庫。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張
使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張
使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張

布隆過濾器原理深入解讀

布隆過濾器的數據結構

布隆過濾器(Bloom Filter)的數據結構主要由一個固定長度的位數組(Bit Array)和一組哈希函數(Hash Functions)組成。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張

存儲數據:要存儲的數據,通過多個hash函數獲取hash值,根據hash計算數組對應位置改為1 。

查詢數據:使用相同hash函數獲取hash值,判斷對應位置是否都為1。

手搓布隆過濾器

直接上代碼。

使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張
使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張
使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張
使用布隆過濾器解決緩存穿透問題(超詳細原理解讀)-第3張

System.out.println("apple: " + bloomFilter.mightContain("apple")); // 應該輸出 true

System.out.println("banana: " + bloomFilter.mightContain("banana")); // 應該輸出 true

System.out.println("orange: " + bloomFilter.mightContain("orange")); // 應該輸出 false

--------------------------

布隆過濾器的優缺點總結

優點

空間效率:布隆過濾器使用位數組存儲數據,因此非常節省空間,特別是對於大規模數據集。

時間效率:布隆過濾器的添加和查詢操作時間複雜度接近O(1),即常數時間複雜度,非常快速。

簡單性:布隆過濾器的實現相對簡單,易於理解和實現。

無誤漏:布隆過濾器不會錯誤地報告元素不存在(誤漏),即如果一個元素被添加到了布隆過濾器中,那麼查詢時一定能被檢測到。

缺點

誤判:布隆過濾器允許誤判(false positives),即可能會錯誤地報告一個元素存在。

不支持刪除:標準的布隆過濾器不支持刪除操作,因為刪除一個元素可能會影響其他元素的測試結果。

固定大小:布隆過濾器一旦創建,其大小和哈希函數數量就固定了,這限制了其靈活性。

內存消耗:雖然布隆過濾器節省空間,但在處理非常大的數據集時,即使是優化過的布隆過濾器也可能消耗大量內存。


© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com