国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis系列16:聊聊布隆過(guò)濾器(原理篇)

這篇具有很好參考價(jià)值的文章主要介紹了Redis系列16:聊聊布隆過(guò)濾器(原理篇)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Redis系列1:深刻理解高性能Redis的本質(zhì)
Redis系列2:數(shù)據(jù)持久化提高可用性
Redis系列3:高可用之主從架構(gòu)
Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列5:深入分析Cluster 集群模式
追求性能極致:Redis6.0的多線(xiàn)程模型
追求性能極致:客戶(hù)端緩存帶來(lái)的革命
Redis系列8:Bitmap實(shí)現(xiàn)億萬(wàn)級(jí)數(shù)據(jù)計(jì)算
Redis系列9:Geo 類(lèi)型賦能億級(jí)地圖位置計(jì)算
Redis系列10:HyperLogLog實(shí)現(xiàn)海量數(shù)據(jù)基數(shù)統(tǒng)計(jì)
Redis系列11:內(nèi)存淘汰策略
Redis系列12:Redis 的事務(wù)機(jī)制
Redis系列13:分布式鎖實(shí)現(xiàn)
Redis系列14:使用List實(shí)現(xiàn)消息隊(duì)列
Redis系列15:使用Stream實(shí)現(xiàn)消息隊(duì)列

1 Bloom Filter 介紹

布隆過(guò)濾器(Bloom Filter)是 Redis 4.0 版本提供的新功能,我們一般將它當(dāng)做插件加載到 Redis 服務(wù)器中,給 Redis 提供強(qiáng)大的去重功能。
它是一種概率性數(shù)據(jù)結(jié)構(gòu),可用于判斷一個(gè)元素是否存在于一個(gè)集合中。相比較之 Set 集合的去重功能,布隆過(guò)濾器空間上能節(jié)省 90% +,不足之處是去重率大約在 99% 左右,那就是有 1% 左右的誤判率,這種誤差是由布隆過(guò)濾器的自身結(jié)構(gòu)決定的。

  • 優(yōu)點(diǎn):空間效率和查詢(xún)時(shí)間都比一般的算法要好的多
  • 缺點(diǎn):有一定的誤識(shí)別率和刪除困難

2 原理分析

布隆過(guò)濾器(Bloom Filter)是一個(gè)高空間利用率的概率性數(shù)據(jù)結(jié)構(gòu),由二進(jìn)制向量(即位數(shù)組)和一系列隨機(jī)映射函數(shù)(即哈希函數(shù))兩部分組成。
通過(guò)使用exists()來(lái)判斷某個(gè)元素是否存在于自身結(jié)構(gòu)中。當(dāng)布隆過(guò)濾器判定某個(gè)值存在時(shí),其實(shí)這個(gè)值只是有可能存在;當(dāng)它說(shuō)某個(gè)值不存在時(shí),那這個(gè)值肯定不存在,這個(gè)誤判概率大約在 1% 左右。
原理拆解如下:

  • 在一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)的基礎(chǔ)上,將元素哈希成不同的位置,每個(gè)位置對(duì)應(yīng)二進(jìn)制向量中的一個(gè)比特位。
  • 當(dāng)加入一個(gè)元素時(shí),采用 n 個(gè)相互獨(dú)立的 Hash 函數(shù)計(jì)算key,然后將元素 Hash 映射的 n 個(gè)位置全部設(shè)置為 1。
  • 檢測(cè) key 是否存在,仍然用 Hash 函數(shù)計(jì)算出這 n 個(gè)位置,如果元素key 存在于集合中,則對(duì)應(yīng)的位置為1,否則為0。
  • 如果n個(gè)位置均為1的話(huà),可以確定元素key可能存在于集合中;如果有一個(gè)為0,那么元素的key一定不存在于集合中,下面會(huì)詳細(xì)分析這句話(huà)。
  • 這種判斷機(jī)制會(huì)存在誤判的可能,但它以較小的空間代價(jià)和極簡(jiǎn)的時(shí)間復(fù)雜度來(lái)近似解決集合交、并、差等操作。

2.1 添加元素步驟

Redis系列16:聊聊布隆過(guò)濾器(原理篇)
當(dāng)使用布隆過(guò)濾器添加 key 時(shí),會(huì)使用不同的 hash 函數(shù)對(duì) key 存儲(chǔ)的元素值進(jìn)行哈希計(jì)算,從而會(huì)得到多個(gè)哈希值。根據(jù)哈希值計(jì)算出一個(gè)整數(shù)索引值,將該索引值與位數(shù)組長(zhǎng)度做取余運(yùn)算,最終得到一個(gè)位數(shù)組位置,并將該位置的值變?yōu)?1。每個(gè) hash 函數(shù)都會(huì)計(jì)算出一個(gè)不同的位置,然后把數(shù)組中與之對(duì)應(yīng)的位置變?yōu)?1。這邊可能出現(xiàn)元素碰撞的情況,比如位置3,a元素和b元素的hash計(jì)算位置一致,所以出現(xiàn)了碰撞。

2.2 判定元素是否存在步驟

如果我們要判定一個(gè)元素是否存在,需要如下步驟:

  • 首先對(duì)給定元素key執(zhí)行哈希計(jì)算,這樣可以得到元素增加時(shí)的bit位數(shù)組位置
  • 判斷這些位置是否都為 1,如果其中有一個(gè)為 0,那么說(shuō)明元素不存在
  • 若全部位置都為 1,則說(shuō)明元素有可能存在。

為啥說(shuō)是可能存在呢,因?yàn)樯厦嬲f(shuō)過(guò)了,哈希函數(shù)出的結(jié)果會(huì)出現(xiàn)碰撞,所以布隆過(guò)濾器會(huì)存在誤判。
Redis系列16:聊聊布隆過(guò)濾器(原理篇)
如上圖c,他的位置被其他元素的位置完全覆蓋,即使c沒(méi)有存儲(chǔ),對(duì)應(yīng)位置上也被a和b的Hash函數(shù)設(shè)置為1,這時(shí)候就可能誤判為c是有存儲(chǔ)的。
有概率存在這樣的 key,它們內(nèi)容不同,但多次 Hash 后的 Hash 值都相同。

2.3 元素刪除步驟

一般不會(huì)刪除元素,我們上面說(shuō)了,因?yàn)榭赡艽嬖谂鲎睬闆r,所以也有可能存在誤刪除情況。
Redis系列16:聊聊布隆過(guò)濾器(原理篇)
刪除意味著需要將對(duì)應(yīng)的 n 個(gè) bits 位置設(shè)置為 0,其中有可能是其他元素對(duì)應(yīng)的位。
比如圖中的b刪除之后,位置3的值也被設(shè)置為0,這樣a也可能會(huì)被判定為不存在。

3 使用場(chǎng)景介紹

我們?cè)谟龅綌?shù)據(jù)量大的時(shí)候,為了去重并避免大批量的重復(fù)計(jì)算,可以考慮使用 Bloom Filter 進(jìn)行過(guò)濾。
具體常用的經(jīng)典場(chǎng)景如下:

  • 解決大流量下緩存穿透的問(wèn)題,參考筆者這篇《一次緩存雪崩的災(zāi)難復(fù)盤(pán)》。
  • 過(guò)濾被屏蔽、拉黑、減少推薦的信息,一般你在瀏覽抖音或者百度App的時(shí)候,看到不喜歡的會(huì)設(shè)置減少推薦、屏蔽此類(lèi)信息等,都可以采用這種原理設(shè)計(jì)。
  • 各種名單過(guò)濾,使用布隆過(guò)濾器實(shí)現(xiàn)第一層的白名單或者黑名單過(guò)濾,可用于各種AB場(chǎng)景。

4 安裝集成

如果是自己編譯安裝,可以從 github 下載,目前的latest 的 release 版本是 v2.4.5,下載地址如下:
https://github.com/RedisBloom/RedisBloom/releases/tag/v2.4.5
Redis系列16:聊聊布隆過(guò)濾器(原理篇)

直接按照編譯的方式進(jìn)行安裝:

# 解壓文件:
tar -zxvf tar -zxvf RedisBloom-2.4.5.tar.gz
# 進(jìn)入目錄:
cd RedisBloom-2.4.5
# 執(zhí)行編譯命令,生成redisbloom.so 文件:
make
# 拷貝至指定目錄:
cp redisbloom.so /usr/local/redis/RedisBloom-2.4.5/redisbloom.so

# 需要修改 redis.conf 文件,新增 loadmodule配置,并重啟 Redis。
# 在redis配置文件里加入以下配置:
loadmodule /usr/local/redis/RedisBloom-2.4.5/redisbloom.so

# 配置完成后重啟redis服務(wù):
redis-server /usr/local/redis/RedisBloom-2.4.5/redis.conf

# 測(cè)試是否安裝成功
127.0.0.1:6379> bf.add user brand
(integer) 1
127.0.0.1:6379> bf.exists user brand
(integer) 1

5 總結(jié)

大致說(shuō)了布隆過(guò)濾器的原理和使用場(chǎng)景,下一篇我們來(lái)看看實(shí)戰(zhàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481139.html

到了這里,關(guān)于Redis系列16:聊聊布隆過(guò)濾器(原理篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis----布隆過(guò)濾器

    目錄 背景 解決方案 什么是布隆過(guò)濾器 布隆過(guò)濾器的原理 一些其他運(yùn)用 比如我們?cè)谟^(guān)看新聞或者刷微博的時(shí)候,會(huì)不停地給我們推薦新的內(nèi)容,我們發(fā)現(xiàn)幾乎沒(méi)有重復(fù)的,說(shuō)明后臺(tái)已經(jīng)進(jìn)行了去重處理,基于如何去重,Redis給出了高效的方案---布隆過(guò)濾器 1.記錄已經(jīng)瀏覽過(guò)

    2024年02月09日
    瀏覽(24)
  • 【Redis】Redis中的布隆過(guò)濾器

    【Redis】Redis中的布隆過(guò)濾器

    在實(shí)際開(kāi)發(fā)中,會(huì)遇到很多要判斷一個(gè)元素是否在某個(gè)集合中的業(yè)務(wù)場(chǎng)景,類(lèi)似于垃圾郵件的識(shí)別,惡意IP地址的訪(fǎng)問(wèn),緩存穿透等情況。類(lèi)似于緩存穿透這種情況,有許多的解決方法,如:Redis存儲(chǔ)Null值等,而對(duì)于垃圾郵件的識(shí)別,惡意IP地址的訪(fǎng)問(wèn),我們也可以直接用 H

    2024年02月12日
    瀏覽(29)
  • 布隆過(guò)濾器的原理

    布隆過(guò)濾器是一種用于檢索一個(gè)元素是否在一個(gè)集合中的數(shù)據(jù)結(jié)構(gòu),具有高效的查詢(xún)性能和較小的內(nèi)存占用。 布隆過(guò)濾器的底層實(shí)現(xiàn)主要涉及以下幾個(gè)步驟: 初始化數(shù)組: 首先,初始化一個(gè)比較大的數(shù)組,數(shù)組中的元素用二進(jìn)制表示,初始值都為0。 Hash計(jì)算: 當(dāng)一個(gè)新的元

    2024年01月18日
    瀏覽(18)
  • 布隆過(guò)濾器:原理與應(yīng)用

    布隆過(guò)濾器:原理與應(yīng)用

    本文已收錄至GitHub,推薦閱讀 ?? Java隨想錄 微信公眾號(hào):Java隨想錄 原創(chuàng)不易,注重版權(quán)。轉(zhuǎn)載請(qǐng)注明原作者和原文鏈接 目錄 布隆過(guò)濾器簡(jiǎn)介 fpp 布隆過(guò)濾器原理 布隆過(guò)濾器的特點(diǎn) 布隆過(guò)濾器使用 布隆過(guò)濾器中的數(shù)據(jù)可不可以刪除 布隆過(guò)濾器應(yīng)該設(shè)計(jì)為多大 布隆過(guò)濾器應(yīng)

    2024年02月08日
    瀏覽(20)
  • 解釋一下布隆過(guò)濾器原理

    鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。請(qǐng)看到最后就能獲取你想要的,接下來(lái)的是今日的面試題: 1.解釋一下布隆過(guò)濾器原理 在日常生活中,包括在設(shè)計(jì)計(jì)算機(jī)軟件時(shí),我們經(jīng)常要判斷一個(gè)元素是否在一個(gè)集合中。比如在字處理軟件中,需要檢查一個(gè)英語(yǔ)單詞是

    2023年04月10日
    瀏覽(25)
  • redis的安裝及布隆過(guò)濾器安裝

    redis的安裝及布隆過(guò)濾器安裝

    IP mysql: 172.18.12.2 ~ 12.9 redis: 172.18.12.10 ~172.18.12.19 /usr/local/software mkdir redis mkdir 6380 /usr/local/software/redis/6380 成功結(jié)果: 成功: 可以把布隆過(guò)濾器理解為bitmap結(jié)構(gòu),判斷某個(gè)對(duì)象是否存在時(shí),它可能會(huì)誤判。但是布隆過(guò)濾器也不是特別不精確,只要參數(shù)設(shè)置得合理,它的精確度也可

    2024年01月21日
    瀏覽(32)
  • Redis之布隆過(guò)濾器(Bloom Filter)解讀

    Redis之布隆過(guò)濾器(Bloom Filter)解讀

    目錄 引進(jìn)前言 隆過(guò)濾器定義 隆過(guò)濾器原理? 布隆過(guò)濾器優(yōu)缺點(diǎn) 布隆過(guò)濾器的使用場(chǎng)景 布谷鳥(niǎo)過(guò)濾器(了解)? 引進(jìn)前言 在實(shí)際開(kāi)發(fā)中,會(huì)遇到很多要 判斷一個(gè)元素是否在某個(gè)集合中 的業(yè)務(wù)場(chǎng)景,類(lèi)似于垃圾郵件的識(shí)別,惡意ip地址的訪(fǎng)問(wèn),緩存穿透等情況。類(lèi)似于緩存穿透

    2024年02月09日
    瀏覽(21)
  • Springboot 在 redis 中使用 Guava 布隆過(guò)濾器機(jī)制

    Springboot 在 redis 中使用 Guava 布隆過(guò)濾器機(jī)制

    在 pom.xml 文件中,引入Spring Boot和Redis相關(guān)依賴(lài) 創(chuàng)建一個(gè)布隆過(guò)濾器配置類(lèi) BloomFilterConfig : 創(chuàng)建一個(gè)BloomFilterController。使用布隆過(guò)濾器判斷數(shù)據(jù)是否存在,從而避免緩存穿透: 向里面添加元素 ?獲取元素

    2024年02月12日
    瀏覽(25)
  • Springboot 在 redis 中使用 BloomFilter 布隆過(guò)濾器機(jī)制

    Springboot 在 redis 中使用 BloomFilter 布隆過(guò)濾器機(jī)制

    在 pom.xml 文件中,引入Spring Boot和Redis相關(guān)依賴(lài) 創(chuàng)建一個(gè)布隆過(guò)濾器配置類(lèi) BloomFilterConfig : 創(chuàng)建一個(gè)BloomFilterController。使用布隆過(guò)濾器判斷數(shù)據(jù)是否存在,從而避免緩存穿透: 向里面添加元素 ?獲取元素

    2024年02月13日
    瀏覽(19)
  • 【算法系列 | 7】深入解析查找算法之—布隆過(guò)濾器

    【算法系列 | 7】深入解析查找算法之—布隆過(guò)濾器

    心若有陽(yáng)光,你便會(huì)看見(jiàn)這個(gè)世界有那么多美好值得期待和向往。 決定開(kāi)一個(gè)算法專(zhuān)欄,希望能幫助大家很好的了解算法。主要深入解析每個(gè)算法,從概念到示例。 我們一起努力,成為更好的自己! 今天第3講,講一下排序算法的選擇排序(Selection Sort) 查找算法是很常見(jiàn)的

    2024年02月14日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包