91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-04-06 10:28:17 來源:億速云 閱讀:439 作者:iii 欄目:開發技術

今天小編給大家分享一下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布隆過濾器大小的算法公式是什么

好像是WTF?不用擔心,實際上我們實際上需要確定我們的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布隆過濾器大小的算法公式是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平武县| 九台市| 谢通门县| 焦作市| 呼图壁县| 泽州县| 兴隆县| 龙游县| 江都市| 通州区| 关岭| 盐城市| 和硕县| 株洲县| 丰宁| 永和县| 宜阳县| 九寨沟县| 南华县| 新龙县| 唐海县| 临江市| 文成县| 浦东新区| 龙南县| 来凤县| 江安县| 六盘水市| 东方市| 儋州市| 瓦房店市| 泽州县| 定边县| 郁南县| 三亚市| 临漳县| 保定市| 中山市| 嘉定区| 桑日县| 阜南县|