布隆過濾器

這玩意用來幹嘛呢?我說個場景:我給你推送新聞,理論上來講每條新聞只能推送一次,那麼該如何確保每條新聞只對你推送一次呢?

布隆過濾器就是用來解決此類問題的,雖然稍微有那麼點不精確,但人家在空間上能節省90%以上。Redis4.0之後才提供該功能。

其特點就是:當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就肯定不存在。

常用指令:

bf.add:添加元素,只能一次添加一個元素

bf.exists:查詢元素是否存在

bf.madd:指令一次添加多個

bf.mexists:指令一次查詢多個元素

還提供了自定義參數的布隆過濾器,需要在add之前使用bf.reserve指令顯式創建。如果重複創建則bf.reserve會報錯。

bf.reserve有三個參數:key,error_rate和initial_size。

error_rate錯誤率,其數字越低,則需要的空間越大。

initial_size參數表示預計放入的元素數量,當實際數量超出這個數值時,誤判率會上升。所以要提前設置一個較大的數值避免超出導致誤判率升高。如果不使用 bf.reserve,默認的error_rate是 0.01,默認的initial_size是100。

注意事項:

initial_size估值過大則會浪費存儲空間,否則估值過小則會影響準確率,因此儘量在使用之前儘可能地精確估計好元素數量,還需要加上一定的冗餘空間以避免實際元素可能會意外高出估計值很多。

計算公式:

①hash函數的最佳數量k = 0.7 * (l/n) # 約等於

②位數組的長度(需要的存儲空間大小bit)f=0.6185^(l/n) # ^ 表示次方計算,也就是 math.pow

③當實際元素超出預計元素時,錯誤率會變化f=(1-0.5^t)^k # 極限近似,k 是 hash 函數的最佳數量

n預計元素的數量

發佈了167 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章