一、核心结构与工作原理

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 对方…