布隆过滤器基本原理与使用

目录

1.引言

2.基本定义

3.基本原理

4.实现方法

5.布隆过滤器的优缺点

6.哈希冲突和误判问题

7.大规模数据集Redis中布隆过滤器的性能优化

8.应用场景举例


1.引言

        在互联网应用中,随着用户基数和交互数据的爆炸性增长,如何高效地处理点赞、签到、收藏和评论等用户行为成为了系统设计中的一个关键问题。传统的数据存储和查询方法可能会因为大量的数据库操作而导致性能瓶颈。为了解决这一问题,布隆过滤器作为一种高效的数据结构,以其时间复杂度低、空间效率高和快速响应的特点,被广泛应用于减少数据库访问、提高系统性能和实现实时数据处理。它通过允许一定比例的误判来换取存储空间的极大节省,尤其适合于大规模数据集和高并发场景下的应用需求

2.基本定义

        布隆过滤器(Bloom Filter)是一种空间效率很高的概率型数据结构,用于测试一个元素是否是一个集合的成员。它允许一些误报(false positives),但不允许误报(false negatives)。这意味着,布隆过滤器可能会告诉你一个元素存在于集合中(即使它可能不存在),但它永远不会告诉你一个元素不存在(如果它实际上存在)。

3.基本原理

布隆过滤器的核心原理包括以下几点:

1.位数组:使用一个足够大的位数组来表示集合,所有位初始状态都设置为0。

2.哈希函数:使用多个哈希函数来将元素映射到位数组中的多个位置。

3.插入操作:当插入一个元素时,通过哈希函数计算出位数组中的位置,并将这些位置的对应位设置为1。

4.查询操作:当查询一个元素是否存在时,同样通过哈希函数计算出位数组中的位置,检查这些位置的位是否都为1。如果都为1,则认为元素可能存在于集合中;如果存在任何位置的位为0,则元素肯定不在集合中。

4.实现方法

实现布隆过滤器的步骤通常包括:

  1. 确定大小:根据预期存储的元素数量和可接受的误报率,确定位数组的大小。

  2. 选择哈希函数:选择或设计多个哈希函数,理想情况下,这些哈希函数应具有较低的碰撞概率。

  3. 插入元素:对于每个要插入的元素,使用哈希函数计算出位数组中的位置,并将这些位置的位设置为1。

  4. 查询元素:对于每个要查询的元素,使用哈希函数计算位数组中的位置,检查这些位置的位是否都为1。

  5. 优化和调整:根据实际使用情况,可能需要调整位数组的大小或哈希函数的数量以优化性能。

5.布隆过滤器的优缺点

是其设计和使用中的关键考量因素。

A. 优点

  1. 时间复杂度低:布隆过滤器的查询和插入操作的时间复杂度为O(k),其中k是哈希函数的数量。由于k通常是一个相对较小的常数,这使得布隆过滤器在处理大量数据时非常快速。

  2. 保密性强:布隆过滤器不存储元素的任何实际信息,只存储元素的哈希值。这意味着即使布隆过滤器的数据被访问,也无法从中恢复原始数据,从而提供了一定程度的隐私保护。

  3. 存储空间小:与传统的数据结构(如列表、集合、映射等)相比,布隆过滤器在存储大量元素时可以显著减少内存使用。这使得它非常适合于内存受限的环境。

B. 缺点

  1. 一定的误判率:布隆过滤器的主要缺点是它可能会错误地报告一个不存在的元素为存在(误报)。这种误判是概率性的,可以通过调整布隆过滤器的大小和哈希函数的数量来控制,但无法完全消除。

  2. 无法获取元素本身:由于布隆过滤器不存储元素的实际值,因此无法从布隆过滤器中检索出具体的元素。

  3. 很难删除元素:在布隆过滤器中删除元素是困难的,因为一个位可能对应多个元素。如果简单地将某一位设置回0,可能会影响其他元素的存在判断。虽然存在一些变体(如计数布隆过滤器)可以支持删除操作,但这通常需要更多的内存和计算。

6.哈希冲突和误判问题

在布隆过滤器中,哈希冲突发生在多个不同的元素通过哈希函数映射到位数组的同一位置。这可能导致误判,即认为一个不在集合中的元素存在。

A . 解决方法

为了减少误判的可能性,布隆过滤器使用多个哈希函数而不是单个哈希函数。每个元素都通过这些不同的哈希函数映射到位数组中的不同位置。

插入元素流程变为:根据一系列Hash函数得到一系列地址,将对应地址下标值改为1,流程图如下:

B. 多哈希函数的工作原理

  1. 插入元素:当插入一个元素时,使用多个哈希函数计算出多个位置,并将这些位置的位设置为1。

  2. 查询元素:当查询一个元素是否存在时,同样使用这些哈希函数计算出多个位置,然后检查这些位置的位是否都为1。只有当所有计算出的位置的位都是1时,才认为元素可能存在于集合中;如果任何一个位置的位为0,则元素肯定不在集合中。

7.大规模数据集Redis中布隆过滤器的性能优化

  1. 合理配置位数组大小和哈希函数数量:根据预期存储的数据量和可接受的误报率,使用布隆过滤器的容量计算公式来确定位数组的大小和哈希函数的数量。

  2. 使用Redis的bitmaps:Redis的键可以存储最大容量为512MB的字符串,一个位图(bitmap)可以在一个Redis键中存储最多2^32个位。利用bitmaps可以有效地实现布隆过滤器,并且易于操作。

  3. 选择合适的哈希算法:选择高效且分布均匀的哈希算法,以减少哈希碰撞的概率。MurmurHash或CityHash是不错的选择。

  4. 分片布隆过滤器:当单个Redis实例或键的容量无法满足大规模数据集时,可以考虑将布隆过滤器分片,分布到多个Redis键或实例中。

  5. 内存优化:Redis运行在内存中,确保服务器有足够的内存来存储布隆过滤器数据。如果内存有限,考虑使用更紧凑的数据结构或优化现有数据结构。

  6. 持久化策略:根据需要选择合适的持久化策略(RDB或AOF),确保布隆过滤器的数据在服务器重启后依然可用。

  7. 并发控制:在高并发场景下,合理控制并发访问布隆过滤器的请求,避免过多的锁竞争,可以使用Redis的事务或Lua脚本实现原子操作。

  8. 监控和调优:监控Redis实例的性能指标,如内存使用、网络流量、延迟等,根据监控结果调整布隆过滤器的配置。

  9. 使用Redis Cluster:如果数据规模非常大,可以考虑使用Redis Cluster来分布式存储布隆过滤器,提高系统的可扩展性和容错性。

  10. 定期维护:定期检查布隆过滤器的性能,根据实际使用情况进行调整,比如增大位数组大小或优化哈希函数。

8.应用场景举例

Redis布隆过滤器在应用场景中非常有用,特别是在需要快速判断元素是否存在而又不占用大量存储空间的情况下。以下是一些具体的应用场景,包括点赞、签到、收藏和评论系统:

  1. 点赞系统:

    • 使用布隆过滤器可以快速判断用户是否已经点赞过某个内容,从而避免重复点赞的问题。

    • 减少数据库查询,提高系统性能。

  2. 签到系统:

    • 在每日签到的场景中,布隆过滤器可以用来记录用户是否已经签到。

    • 快速检查用户签到状态,避免对数据库进行不必要的写操作。

  3. 收藏系统:

    • 当用户收藏内容时,可以通过布隆过滤器记录收藏行为,防止重复收藏。

    • 快速检索用户收藏记录,提高响应速度。

  4. 评论系统:

    • 在评论系统中,布隆过滤器可以用于检测用户是否已经发表过评论。

    • 预防同一用户对同一内容重复评论。

  5. 垃圾邮件和恶意请求过滤:

    • 布隆过滤器可以存储已知的垃圾邮件或恶意请求的特征码,快速判断并拦截这些请求。

  6. 缓存穿透保护:

    • 当使用Redis作为缓存系统时,布隆过滤器可以作为一层保护,记录查询的key,避免对数据库进行不存在数据的查询。

  7. 实时推荐系统:

    • 在推荐系统中,布隆过滤器可以快速判断用户是否已经浏览或不感兴趣的项目,从而优化推荐结果。

  8. 会话管理:

    • 在需要记录用户访问或行为的会话管理中,布隆过滤器可以用于记录用户的会话标识,快速判断用户是否在线。

  9. 广告点击跟踪:

    • 用于记录用户是否点击过某个广告,避免同一用户对同一广告的重复点击。

  10. 社交网络中的朋友推荐:

    • 快速判断两个用户是否共同拥有好友,从而推荐可能认识的人。

推荐阅读:

C++之std::bitset使用精讲(全)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443974.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue出现Component name “Politic“ should always be multi-word错误

效果 原因 组件名不能为单个单词,怕和html标签混淆 解决方法 1.选择多个单词区分 2.修改package.json里的rules规则,忽略文件命名校验

跨平台游戏的特点

跨平台游戏已成为视频游戏行业的主要趋势,这是由于对各种设备和操作系统之间无缝游戏的需求日益增长。这种方法允许玩家在多个平台(如游戏机、PC和移动设备)上享受他们最喜欢的游戏,同时保持相同的体验和进度。随着越来越多的开发…

【2024年最新】基于springboot+mysql就业信息管理系统

技术摘要 技术框架:以springboot作为框架,业务模式:B/S模式数据库:MySql作为后台运行的数据库服务器:使用Tomcat用为系统的服务器 系统展示 系统实现功能 本次实现一个就业信息管理系统,通过这个系统能够满…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十二章 安装VMware Tool 工具

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

ssrf学习(ctfhub靶场)

ssrf练习 目录 ssrf漏洞 漏洞形成原理(来自网络) 寻找ssrf漏洞, 靶场题目 第一题(url探测网站下文件) 第二关(使用伪协议) 关于http和file协议的理解 file协议 http协议 第三关&…

猫头虎分享已解决Bug || Error: ERESOLVE unable to resolve dependency tree 解决方案

🐯 猫头虎分享已解决Bug || Error: ERESOLVE unable to resolve dependency tree 解决方案 摘要 在前端开发中,尤其是使用 Node.js 和 npm 管理依赖时,ERESOLVE unable to resolve dependency tree 错误是很多开发者遇到的常见问题。这个 Bu…

jQuery 用户登录页面非空校验与登录测试

文章目录 实战介绍准备工作创建网页导入样式表和jQuery库编写页面代码编写脚本代码创建成功页面浏览网页和测试结束语 实战介绍 大家好,今天我们将一起学习如何使用jQuery来为用户登录页面进行非空校验和登录测试。通过这个实战项目,你将学会如何通过jQ…

新版 Notepad++ 下载与安装教程

一、软件准备:麻烦点我 二、双击下载好的 notepad 软件进行安装,选择 “简体中文”。 三、默认 “下一步” 安装。 四、单击 “我接受” 按钮。 五、自定义安装位置,个人建议安装在 D 盘。 六、选择组件,默认 “下一步”。 七、勾…

使用Diskgenius系统迁移

使用Diskgenius系统迁移 1、使用系统迁移2、注意点3、新备份的系统盘装在电脑上可能出现盘符错乱导致开机不进入桌面情况 1、使用系统迁移 参考视频: DiskGenius无损系统迁移,换硬盘无需重装系统和软件 2、注意点 1)新的硬盘里面的所有资料…

第十八篇:一文说清楚ICMP的底层原理

作为程序员或者网络工程师,有时候无法访问对方主机;导致这个现象的有很多原因,那要排查具体的网络原因,可能会用到ping的指令。而ping的底层实现是互联⽹控制报⽂协议(ICMP)。 ICMP 全称是 Internet Contr…

前端_002_CSS扫盲

文章目录 概念选择器常用属性背景边框高度和宽度颜色文本字体链接表格里对齐显示相关溢出,滚动条属性 伪类和伪元素 概念 1.书写格式: 选择器{ 属性名:属性值 ; 属性名:属性值 ; } 2.文件后缀.css 选择器 元素选择器 [tag] id选择器 #[id_name] c…

直线导轨在自动化设备中需要注意什么?

直线导轨属于精密传动配件,因而在使用时要求有相当地慎重态度,如果使用不当,也不能达到预期的性能效果,尤其是保管和保养不当,很容易造成导轨失效等问题,导致无法正常使用。因此,自动化设备中使…

string 类

一、为什么学习 string 类 1、C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底…

3-GPIO八大输出模式 推挽输出 与 开漏输出

推挽输出 与 开漏输出 GPIO有八大输出模式 下图为每个GPIO口的基本结构: 通过这张图来学习 最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。 芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口&a…

DBMS-3.3 SQL(3)——DML的INSERT、UPDATE、DELETE空值的处理DCL

本文章的素材与知识来自李国良老师和王珊老师。 DML——INSERT、UPDATE、DELETE 一. INSERT 1.语法 (1)INTO子句 (2)VALUES子句 (3)示例 2.插入子查询 若插入的是子查询则不需要VALUES子句 二. UPDATE …

一款电子产品图册转换器

​随着科技的不断发展,电子产品已经成为我们生活中不可或缺的一部分。无论是手机、平板电脑还是智能家居,它们都离不开电子图册的支撑。一款优秀的电子产品图册转换器,可以帮助我们轻松实现电子图册的转换,为我们的生活和工作带来…

还在为Python“运算符”中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!

博客主页:长风清留扬-CSDN博客系列专栏:Python疑难杂症百科-BUG编年史每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法感谢大家点…

[SAP ABAP] LIKE TABLE OF

LIKE TABLE OF语句是用来参照结构体(工作区)对象定义内表数据类型的语句 在SAP ABAP中有标准表&#xff0c;排序表和哈希表三种内表数据类型 *定义标准表 DATA: <ty_tab_standard_name> LIKE [STANDARD] TABLE OF <dtype> [WITH NON-UNIQUE KEY <k1 k2 ... kn…

移动app的UI和接口自动化测试怎么进行?

标题&#xff1a;从0到1&#xff1a;移动App的UI和接口自动化测试 导语&#xff1a;移动App的快速发展使得UI和接口自动化测试成为了确保应用质量的重要环节。本文将从零开始介绍移动App的UI和接口自动化测试的基本概念以及如何进行测试。 第一部分&#xff1a;了解移动App自动…

MSYS2+GCC 安装与应用保姆手册

msys2 提供可在Windows下使用 GCC 编译器&#xff1b;并且&#xff0c;借助 Linux 包管理功能&#xff0c;可轻松下载丰富的可在Windows下直接使用的 C/C 开发包&#xff0c;包括编译好的二进制包。 网络库asio、准标准库boost、zip解压缩、json格式处理、引擎 SDL……十八般兵…