目錄
1. 簡介
2. 應用程式場景
2.1 快取穿透
2.2 判斷某個數據是否在海量數據中存在
3. HashMap的問題
4. 理解布隆過濾器
5. 根據布隆過濾器查詢元素
6. 可以刪除麼
7. 如何選擇哈希函數個數和布隆過濾器長度
更多應用程式場景
首頁 資料庫 Redis Redis布隆過濾器大小的演算法公式是什麼

Redis布隆過濾器大小的演算法公式是什麼

May 31, 2023 pm 08:17 PM
redis

1. 簡介

客戶端:這個key存在嗎?

伺服器:不存在/不知道

布隆過濾器是一種比較巧妙的機率型資料結構,其本質是一種資料結構。它的特點是有效率地插入和查詢。但我們要檢查一個key是否在某個結構中存在時,透過使用布隆過濾器,我們可以快速了解到「這個key一定不存在或可能存在」。相較於傳統的List、Set、Map這些資料結構,它更有效率、佔用的空間也越少,但是它回傳的結果是機率性的,是不確切的。

布隆過濾器僅用於測試集合中的成員資格。經典的布隆過濾器範例是透過減少對不存在的金鑰的昂貴的磁碟(或網路)查找來提高效率。正如我們所看到的那樣,布隆過濾器可以在O(k)恆定時間內搜尋密鑰,其中k是雜湊函數的數量,測試密鑰的不存在將非常快。

2. 應用程式場景

2.1 快取穿透

為了提高存取效率,我們會將一些資料放在Redis快取中。當進行數據查詢時,可以先從快取中獲取數據,無需讀取資料庫。這樣可以有效提升性能。
在數據查詢時,首先要判斷快取中是否有數據,如果有數據,就直接從快取中獲取數據。
但如果沒有數據,就需要從資料庫中取得數據,然後放入快取。如果大量存取都無法命中緩存,會造成資料庫要扛較大壓力,導致資料庫崩潰。而使用布隆過濾器,當存取不存在的快取時,可以迅速回傳避免快取或DB crash。

2.2 判斷某個數據是否在海量數據中存在

HBase中儲存著非常海量數據,要判斷某個ROWKEYS、或者某個列是否存在,使用布隆過濾器,可以快速取得某個資料是否存在。但有一定的誤判率。但如果某個key不存在,一定是準確的。

3. HashMap的問題

要判斷某個元素是否存在其實用HashMap效率是非常高的。 HashMap透過把值映射為HashMap的Key,這種方式可以實現O(1)常數級時間複雜​​度。
但是,如果儲存的資料量非常大的時候(例如:上億的資料),HashMap將會耗費非常大的記憶體大小。而且根本無法一次將海量的資料讀進記憶體。

4. 理解布隆過濾器

工作原理圖:

Redis布隆過濾器大小的演算法公式是什麼

#布隆過濾器是一個bit數組或稱為一個bit二進位向量
這個陣列中的元素存的要麼是0、要麼是1
k個hash函數都是彼此獨立的,並將每個hash函數計算後的結果對數組的長度m取模,並將對一個的bit設為1(藍色單元格)
我們將每個key都按照這種方式設定單元格,就是「布隆過濾器」

5. 根據布隆過濾器查詢元素

假設輸入一個key,我們使用之前的k個hash函數求哈希,得到k個值
判斷這k個值是否都為藍色,如果有一個不是藍色,那麼這個key一定不存在
如果都有藍色,那麼key是可能存在(布隆過濾器會存在誤判)
因為如果輸入物件很多,而集合比較小的情況,會導致集合中大多位置都會被描藍,那麼檢查某個key時候為藍色時,剛好某個位置正好被設定為藍色了,此時,會錯誤認為該key在集合中
範例:

Redis布隆過濾器大小的演算法公式是什麼

Redis布隆過濾器大小的演算法公式是什麼

6. 可以刪除麼

傳統的布隆過濾器並不支援刪除操作。但是名為 Counting Bloom filter 的變種可以用來測試元素計數個數是否絕對小於某個閾值,它支援元素刪除。文章Counting Bloom Filter的原理和實作寫得非常詳細,可以詳細閱讀了解。

7. 如何選擇哈希函數個數和布隆過濾器長度

很顯然,過小的布隆過濾器很快所有的bit 位元均為1,那麼查詢任何值都會返回“可能存在”,起不到過濾的目的了。隨著布隆過濾器長度的增加,其誤報率會減少。

另外,雜湊函數的數量也需要權衡,個數越多則布隆過濾器bit 位置位1 的速度越快,且布隆過濾器的效率越低;但是如果太少的話,那我們的誤報率會變高。

Redis布隆過濾器大小的演算法公式是什麼

從上圖可以看出,增加雜湊函數k的數量將大大降低錯誤率p。

Redis布隆過濾器大小的演算法公式是什麼

不必擔心,實際上我們需要確認 m 和 k 的值。那麼,如果我們指定了容錯率p和元素數量n,可以利用以下公式計算這些參數:

我們可以根據濾波器的大小m,雜湊函數的數量k和插入的元素的數量n來計算誤報率p,公式如下:由上面,又怎麼選擇適合業務的k 和m 值呢?
公式:

Redis布隆過濾器大小的演算法公式是什麼

k 為雜湊函數個數,m 為布隆過濾器長度,n 為插入的元素個數,p 為誤報率。
至於如何推導這個公式,我在知乎發布的文章有涉及,感興趣可以看看,不感興趣的話記住上面這個公式就行了。

我還要在這裡提到另一個重要的觀點。由於使用Bloom篩選器的唯一目的是搜尋速度更快,所以我們不能使用慢速雜湊函數,對嗎?加密雜湊函數(例如Sha-1,MD5)對於bloom過濾器不是一個好選擇,因為它們有點慢。因此,從更快的哈希函數實現中更好的選擇是murmur,fnv系列哈希,Jenkins哈希和HashMix。

更多應用程式場景

在給定的範例中您已經看到,我們可以使用它來警告使用者輸入弱密碼。
您可以使用布隆過濾器,以防止使用者從造訪惡意網站。
您可以先使用Bloom Bloom篩選器進行廉價的查找檢查,而不是用查詢SQL資料庫來檢查是否存在具有特定電子郵件的使用者。如果電子郵件不存在,那就太好了!如果確實存在,則可能必須對資料庫進行額外的查詢。您也可以執行相同的操作來搜尋「使用者名稱已被佔用」。
您可以根據網站訪客的IP位址保留一個Bloom過濾器,以檢查您網站的使用者是「回頭用戶」還是「新用戶」。 「回頭用戶」的一些誤報不會傷害您,對嗎?
您也可以透過使用Bloom過濾器追蹤字典單字來進行拼字檢查。

以上是Redis布隆過濾器大小的演算法公式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles