布隆過濾器原理分析、應用場景、與redis使用案例

一、核心結構與工作原理

1.1 數據結構

布隆過濾器由以下兩部分組成:

  1. 位數組(Bit Array):一個長度為?m?的二進制數組,初始所有位為0。
  2. 哈希函數組:k?個獨立的哈希函數,每個函數將輸入元素映射到位數組的某個位置。

1.2 操作流程

(1)添加元素
  1. 哈希計算:對元素應用?k?個哈希函數,得到?k?個哈希值。
  2. 標記位:將位數組中對應?k?個索引的位置全部置為1。
    • 示例:插入元素 "A" 時,哈希函數生成索引2、5、9,則這三個位置被標記為1。
(2)查詢元素
  1. 哈希計算:對元素應用相同的?k?個哈希函數,得到?k?個索引。
  2. 檢查位
    • 全為1:元素可能存在(可能誤判)。
    • 存在0:元素一定不存在。

1.3 誤判率(假陽性率)

誤判率是布隆過濾器的核心特性,由以下公式近似計算:

P≈(1?e?kn/m)k

  • 參數說明
    • m:位數組長度
    • k:哈希函數數量
    • n:已插入元素數量
  • 最優參數選擇
    • 最優?k?值:k=nm?ln2
    • 示例:當?m=1000,n=100?時,最優?k≈7,誤判率約0.6%。

二、特性與優缺點

2.1 特性

  • 空間高效:存儲?n?個元素僅需?m?位,遠小于傳統哈希表。
  • 時間復雜度低:插入和查詢操作均為?O(k),與元素數量無關。
  • 概率性判斷
    • 假陰性(False Negative):不可能發生(若返回不存在,則元素一定不存在)。
    • 假陽性(False Positive):可能發生(若返回存在,則元素可能不存在)。

2.2 優缺點

優點缺點
空間效率極高(誤判率1%時,100萬元素僅需約1.2MB)存在誤判,無法完全消除
查詢和插入操作快速(O(k))不支持直接刪除元素
不存儲元素本身,保密性強參數固定后難以動態調整

三、應用場景

3.1 典型應用

  1. 緩存穿透防御
    • 場景:緩存未命中時,直接查詢數據庫可能導致壓力過大。
    • 解決方案:在緩存前部署布隆過濾器,過濾非法請求(如不存在的Key)。
  2. 數據去重
    • 網絡爬蟲:判斷URL是否已訪問,避免重復爬取。
    • 郵件系統:過濾垃圾郵件黑名單中的郵箱。
  3. 數據庫查詢加速
    • HBase/RocksDB:內置布隆過濾器,減少磁盤IO操作。
  4. 推薦系統
    • 抖音/新聞推薦:過濾已推薦內容,避免重復展示。

四、布隆過濾器與Redis7在Java中的使用案例

? ?Redis 7配置
  • 安裝RedisBloom模塊

  • # 下載RedisBloom
    wget https://github.com/RedisBloom/RedisBloom/archive/v2.2.18.tar.gz
    tar -zxvf v2.2.18.tar.gz
    cd RedisBloom-2.2.18/
    make# 修改redis.conf,加載模塊
    loadmodule /path/to/RedisBloom-2.2.18/redisbloom.so# 啟動Redis
    redis-server /path/to/redis.conf
    驗證模塊加載
  • redis-cli
    127.0.0.1:6379> BF.INFO myFilter
    Java項目依賴
  • pom.xml中添加Jedis依賴:
  • <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.0</version>
    </dependency>
  • 創建布隆過濾器
  • import redis.clients.jedis.Jedis;
    import redis.clients.jedis.commands.ProtocolCommand;
    import redis.clients.jedis.util.SafeEncoder;public class BloomFilterDemo {public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {// 創建布隆過濾器:誤判率1%,容量1000jedis.sendCommand(new ProtocolCommand("BF.RESERVE"),"userFilter","0.01","1000");System.out.println("布隆過濾器創建成功");}}
    }
    添加與查詢元素
  • import redis.clients.jedis.Jedis;
    import redis.clients.jedis.SearchResult;
    import redis.clients.jedis.util.SafeEncoder;public class BloomFilterOperations {public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {// 添加元素String userId = "user123";jedis.sendCommand(new ProtocolCommand("BF.ADD"),"userFilter",userId);// 查詢元素Object result = jedis.sendCommand(new ProtocolCommand("BF.EXISTS"),"userFilter",userId);System.out.println("查詢結果:" + (result.equals(1L) ? "可能存在" : "不存在"));}}
    }
    批量操作
  • // 批量添加
    jedis.sendCommand(new ProtocolCommand("BF.MADD"),"userFilter","user456", "user789"
    );// 批量查詢
    List<Object> results = jedis.sendCommand(new ProtocolCommand("BF.MEXISTS"),"userFilter","user456", "nonexistent"
    ).getResults();

    緩存穿透防御

  • 場景:電商系統防止惡意請求查詢無效商品ID。

    流程

  • 初始化布隆過濾器:預加載所有有效商品ID。
  • 請求攔截
  • public Product getProduct(String productId) {if (jedis.bfExists("productFilter", productId)) {// 從緩存或數據庫查詢return cache.get(productId);}throw new NotFoundException("商品不存在");
    }

    黑名單校驗

    場景:識別垃圾短信或惡意IP。

    實現

  • // 初始化黑名單過濾器
    jedis.bfAdd("spamFilter", "192.168.1.100");// 校驗請求
    public boolean isSpam(String ip) {return jedis.bfExists("spamFilter", ip);
    }

    爬蟲URL去重

  • 場景:避免重復爬取相同URL。

    代碼片段

  • public void crawlUrl(String url) {if (!jedis.bfExists("urlFilter", url)) {jedis.bfAdd("urlFilter", url);// 執行爬取邏輯}
    }

五、局限性與變種方案

4.1 局限性

  1. 不支持刪除:刪除元素可能影響其他元素的判斷(因哈希沖突)。
  2. 參數固定:位數組長度和哈希函數數量需提前確定,擴容復雜。

4.2 變種方案

  1. 計數布隆過濾器(Counting Bloom Filter)
    • 改進:用計數器數組替代位數組,支持刪除操作。
    • 代價:空間開銷增加(每個計數器占4-8位)。
  2. 動態布隆過濾器
    • 改進:支持自動擴容,當元素數量超過閾值時創建新過濾器。
    • 應用:適用于元素數量動態變化的場景。
  3. 分級布隆過濾器
    • 改進:使用多個布隆過濾器逐級過濾,提高精度。
    • 應用:對誤判率要求極高的場景。

六、總結

布隆過濾器通過犧牲少量準確性換取高空間效率和快速查詢,適用于對誤判率可容忍的場景。其核心在于合理選擇位數組長度?m、哈希函數數量?k?和預估元素數量?n,并通過哈希函數均勻分布元素以降低誤判率。變種方案如計數布隆過濾器和動態布隆過濾器進一步擴展了其應用范圍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92944.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步并發×編譯性能:Dart爬蟲的實戰突圍

Dart憑借其高效的異步并發模型、AOT編譯性能和現代化的語法&#xff0c;正成為爬蟲開發中值得關注的新選擇。特別是對于Flutter應用開發者而言&#xff0c;Dart提供了一種"全棧同語言"的獨特優勢。 本文我將通過實戰代碼展示如何利用Dart的核心優勢——包括基于Futur…

Day 8: 深度學習綜合實戰與進階技術 - 從優化到部署的完整流程

Day 8: 深度學習綜合實戰與進階技術 - 從優化到部署的完整流程 ?? 學習目標: 掌握深度學習模型優化、調試、遷移學習等工業級技能,能夠構建高性能的深度學習應用 ?? 核心概念概覽 核心概念解釋: 模型優化: 通過正則化、學習率調度等技術提升模型性能和泛化能力 為什么需…

特征工程--機器學習

1、特征工程1.1 概念特征工程&#xff08;Feature Engineering&#xff09;是機器學習項目中非常關鍵的一步&#xff0c;它是指通過領域知識來選擇、創建或修改能夠使機器學習模型更好地工作的特征&#xff08;即輸入變量&#xff09;。特征工程的目標是提高模型的性能&#xf…

支持任意 MCP 協議的客戶端

支持任意 MCP 協議的客戶端&#xff08;如&#xff1a;Cursor、Claude、Cline&#xff09;可方便使用高德地圖 MCP server。目前支持Streamable HTTP, SSE 和 Node.js I/O 三種接入方式(推薦用戶使用Streamable HTTP)。 快速接入-MCP Server|高德地圖API

【線性代數】目錄

【線性代數】線性方程組與矩陣——&#xff08;1&#xff09;線性方程組與矩陣初步【線性代數】線性方程組與矩陣——行列式【線性代數】線性方程組與矩陣——&#xff08;2&#xff09;矩陣與線性方程組的解【線性代數】線性方程組與矩陣——&#xff08;3&#xff09;線性方程…

豆包新模型+PromptPilot:AI應用開發全流程實戰指南

> 當深度推理的豆包大模型遇上智能提示詞引擎,傳統AI開發中**70%的調試時間被壓縮至幾分鐘**,一場從“手工調參”到“智能優化”的開發范式革命正在發生。 ## 一、技術架構解析:雙引擎驅動智能進化 ### 1.1 豆包新模型的技術突破 2025年火山引擎推出的**豆包1.6系列模型…

Day13 Vue工程化

1.介紹&環境準備 npm兩項全局配置2.項目介紹&開發流程 npm create vue3.3.4 / install / run dev3.API風格 setup ref() onMounted()兩種風格選項式API寫法轉為組合式API寫法在根組件App.vue中引用寫好的xxx.vue4.案例1.引入組件2.完整代碼<script></script&g…

Linux中配置DNS

Linux中配置DNS服務 一、什么是DNS DNS (Domain Name System) 是域名服務 &#xff0c;它是由解析器和域名服務器組成的。 域名服務器是指保存有該網絡中所有主機的域名和對應IP地址&#xff0c; 并具有將域名轉換為IP地址功能的服務器。&#xff08;將網址解析成IP&#xff…

Redis應?-緩存與分布式鎖

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Redis &#x1f525; 什么是緩存 緩存(cache)是計算機中的?個經典的概念.在很多場景中都會涉及到 核?思路就是把?些常?的數據放到觸?可及 (訪問速度更快) 的地?,?便隨時讀取 對于計算機…

TCP、HTTP/HTTPS、FTP 解析 + 面試回答參考

TCP、HTTP/HTTPS、FTP 解析 面試回答參考 在后端開發、網絡編程以及運維面試中&#xff0c;TCP 協議、HTTP/HTTPS、FTP 是高頻考點。本文將從原理、流程、面試常問問題出發&#xff0c;幫你一次性搞懂這些核心知識點。一、TCP 三次握手 1. 作用 建立可靠連接&#xff0c;確保雙…

ATF(TF-A)安全通告 TFV-13(CVE-2024-7881)

安全之安全(security)博客目錄導讀 ATF(TF-A)安全通告匯總 目錄 一、漏洞描述 二、緩解措施與建議 三、補丁修改 關于該漏洞的具體細節,可參考【CVE-2024-7881】ARM CPU漏洞安全通告】 Title 非特權上下文可以觸發數據相關的預取引擎,從而獲取特權位置的內容,并將這些…

Pytorch深度學習框架實戰教程-番外篇02-Pytorch池化層概念定義、工作原理和作用

相關文章 視頻教程 《Pytorch深度學習框架實戰教程01》《視頻教程》 《Pytorch深度學習框架實戰教程02&#xff1a;開發環境部署》《視頻教程》 《Pytorch深度學習框架實戰教程03&#xff1a;Tensor 的創建、屬性、操作與轉換詳解》《視頻教程》 《Pytorch深度學習框架實戰…

常見通信協議詳解:TCP、UDP、HTTP/HTTPS、WebSocket 與 GRPC

常見通信協議詳解&#xff1a;TCP、UDP、HTTP/HTTPS、WebSocket 與 RPC 在現代網絡通信中&#xff0c;各種協議扮演著至關重要的角色&#xff0c;它們決定了數據如何在網絡中傳輸、控制其可靠性、實時性與適用場景。對于開發者而言&#xff0c;理解這些常見的通信協議&#xff…

部署一個自己的音樂播放器教程

以下以部署 YesPlayMusic 為例&#xff0c;介紹兩種常見的部署方法&#xff0c;一種是通過 Node.js 和 Git 在 Windows 系統上部署&#xff0c;另一種是通過 Docker 在 Linux 系統上部署。具體步驟如下&#xff1a;Windows 系統部署&#xff08;基于 Node.js 和 Git&#xff09…

FFMPEG將H264轉HEVC時,碼率縮小多少好,以及如何通過SSIM(Structural Similarity Index結構相似性指數)衡量轉碼損失

最近整理一些視頻&#xff0c;我發現太多了&#xff0c;就想把一些本來就需要轉碼的視頻縮小一下。因為轉碼的時候為了彌補損失&#xff0c;我將碼率增大了 10-20%&#xff0c;但是如果將 H264 轉 HEVC&#xff08;當然也可以是其他格式&#xff09;&#xff0c;那么或許不用增…

前端,route路由

路由定義與導航動態路由匹配&#xff1a;參數傳遞&#xff08;/user/:id&#xff09;嵌套路由配置與 <router-view> 層級渲染編程式導航&#xff1a;router.push、router.replace 和 router.go路由守衛與權限控制全局守衛&#xff1a;beforeEach、beforeResolve、afterEa…

Kubernetes網絡原理深度解析

Kubernetes網絡原理深度解析 1 Kubernetes網絡模型 Kubernetes 網絡模型是其實現容器化應用高效通信的基礎框架。它致力于解決容器編排環境中復雜的網絡連通性、服務發現與負載均衡等問題&#xff0c;追求讓容器、Pod 等網絡端點像傳統主機網絡一樣簡潔、可預測地通信 。其核心…

Python3.10 + Firecrawl 下載 Markdown 文檔:構建高效通用文章爬蟲

在信息爆炸的時代&#xff0c;從各種網站收集和整理文章內容已成為許多開發者和研究人員的常見需求。無論是為了內容聚合、數據分析還是知識管理&#xff0c;一個高效、穩定的通用文章爬蟲都是不可或缺的工具。 本文將詳細介紹如何使用 Python 3.10 結合 Firecrawl API 構建一個…

國產3D大型裝配設計新突破②:裝配約束智能推斷 | 中望3D 2026

本文為CAD芯智庫整理&#xff0c;未經允許請勿復制、轉載&#xff01;→ www.xwzsoft.com/h-nd-605.html中望3D2026亮點速遞之【裝配篇】已經介紹了設計效率的提升&#xff0c;今天將分享的是中望3D2026【裝配約束智能推斷】&#xff0c;也預告一下第三篇是講解【組件復用效率提…

深入淺出設計模式——行為型模式之觀察者模式 Observer

文章目錄1.觀察者模式簡介2.觀察者模式結構3.觀察者模式代碼實例3.0.公共頭文件3.1.觀察者3.1.1.抽象觀察者Observer3.1.2.具體觀察者Player3.2.目標類3.2.1.抽象目標AllyCenter3.2.2.具體目標AllyCenterController循環包含錯誤示例“前向聲明什么時候不夠、必須 #include 對方…