布隆过滤器(Bloom Filter)初学习

目录

1、布隆过滤器是什么

2、布隆过滤器的优缺点

3、使用场景

4、⭐基于Redis的布隆过滤器插件安装

4.1 下载布隆过滤器

4.2 创建文件夹并上传文件

4.3 安装gcc

4.4 解压RedisBloom压缩包

4.5 在解压好的文件夹下输入make

4.6 将编译的好的插件拷贝到docker redis容器中

4.7 修改配置文件,并重启Redis

4.8 查看操作日志

4.9 进入redis客户端查看,测试

4.10 常用命令:

小结


1、布隆过滤器是什么

布隆过滤器(Bloom Filter)是一种空间效率非常高的随机数据结构,用于判断一个元素是否在一个集合中。与传统的哈希表或者二叉搜索树等数据结构不同,布隆过滤器可以在空间和时间上做出很多妥协,从而实现高效的查询和插入操作。

布隆过滤器的核心思想是使用多个哈希函数来将元素映射到位数组中的多个位置上。当一个元素被加入到布隆过滤器中时,它会被多次哈希,并将对应的位数组位置设置为1。当需要判断一个元素是否在布隆过滤器中时,我们只需将该元素进行多次哈希,并检查对应的位数组位置是否都为1,如果其中有任意一位为0,则说明该元素不在集合中;如果所有位都为1,则说明该元素可能在集合中(因为有可能存在哈希冲突),需要进一步检查。

示例图:

图片来源:https://baijiahao.baidu.com/s?id=1760676476679974031&wfr=spider&for=pc

2、布隆过滤器的优缺点

布隆过滤器是一种概率型数据结构,用于快速判断一个元素是否存在于一个集合中。它具有以下优点和缺点:

优点

  1. 高效的查询速度:布隆过滤器的查询时间复杂度是O(1),即使在大规模数据集中也能快速判断一个元素是否存在。
  2. 空间效率高:相比于其他数据结构,布隆过滤器所需的空间通常较小。它利用位数组和哈希函数来表示元素的存在状态,因此占用的内存相对较少。
  3. 支持高并发场景:由于布隆过滤器的查询操作是无锁的,并且不需要访问磁盘或网络,因此适用于高并发的场景。

缺点

  1. 可能出现误判:布隆过滤器存在一定的误判率,即可能将不存在的元素误判为存在。这是由于哈希函数的冲突和位数组的碰撞造成的。误判率随着数据量的增加而增加,可以通过调整哈希函数个数和位数组大小来降低误判率,但不能完全消除。
  2. 不支持删除操作:布隆过滤器设计初衷是用于判断元素是否存在,而不支持删除操作。一旦一个元素被添加到布隆过滤器中,就无法从布隆过滤器中删除。如果需要删除元素,需要使用其他数据结构辅助操作。
  3. 对内存敏感:布隆过滤器对内存的使用非常敏感。为了降低误判率,需要增加位数组的大小和哈希函数的个数,这会增加内存的消耗。在内存资源有限的情况下,需要权衡空间和误判率。

综上所述,布隆过滤器适用于对查询速度要求高、对误判率可以容忍的场景,但需要注意其不支持删除操作和对内存敏感的特点。在实际应用中,需要根据具体需求和数据规模来选择是否使用布隆过滤器。

3、使用场景

常见的使用场景包括:

  1. 网页黑名单过滤:将恶意网站的 URL 存储到布隆过滤器中,当用户访问时,可以快速判断该网站是否为恶意网站,从而进行拦截或提示。

  2. 垃圾邮件过滤:将已知的垃圾邮件的特征(如发件人、主题、内容等)存储到布隆过滤器中,当新邮件到来时,可以快速判断是否为垃圾邮件,从而进行过滤。

  3. ⭐缓存穿透问题解决:当缓存中不存在某个键值对时,可以先通过布隆过滤器判断该键是否存在,如果不存在,则直接返回空值,避免了对数据库等后端存储的不必要查询,从而提高了系统的性能。 

图片来源:Redis6-雪崩、击穿、穿透、分布式锁 - 知乎


图片来源:什么是布隆过滤器? - 知乎

需要注意的是,布隆过滤器的误判率是无法避免的,因此在使用时需要根据具体场景进行权衡和调整。

4、⭐基于Redis的布隆过滤器插件安装

4.1 下载布隆过滤器

首先需要安装完成Redis(安装过程略),然后布隆过滤器便可以作为一个插件加载到Redis服务器直接使用。

Linux版本:https://github.com/RedisBloom/RedisBloom/archive/v2.2.4.tar.gz

4.2 创建文件夹并上传文件

4.3 安装gcc

4.4 解压RedisBloom压缩包

4.5 在解压好的文件夹下输入make

4.6 将编译的好的插件拷贝到docker redis容器中

4.7 修改配置文件,并重启Redis

43 # loadmodule /path/to/my_module.so

44 # loadmodule /path/to/other_module.so

45

46 loadmodule /usr/local/etc/redis/redisbloom.so

4.8 查看操作日志

4.9 进入redis客户端查看,测试

4.10 常用命令:

  1. bf.add:添加元素
  2. bf.madd:批量添加元素
  3. bf.exists:检索元素是否存在
  4. bf.mexists:检索多个元素是否存在
  5. bf.reserve:自定义布隆过滤器,设置key,error_rate和initial_size

小结

由于布隆过滤器不需要存储元素本身,而只需要存储元素的哈希值,因此它的空间效率非常高。同时,由于布隆过滤器使用多个哈希函数来减少哈希冲突的概率,因此它的查询效率也比较高。但是,布隆过滤器存在一定的误判率,即有可能将不在集合中的元素误判为在集合中,这是由于哈希冲突和位数组大小等因素造成的。因此,在使用布隆过滤器时,需要根据具体情况来选择合适的哈希函数个数和位数组大小,以控制误判率。

参考:

硬核|Redis 布隆(Bloom Filter)过滤器原理与实战

布隆过滤器 Bloom Filter - 知乎

什么是布隆过滤器? - 知乎

Redis6-雪崩、击穿、穿透、分布式锁 - 知乎


感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!

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

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

相关文章

Windows下安装Anaconda、Pycharm以及iflycode插件图解

目录 一、下载Anaconda、Pycharm以及iflycode插件 二、创建相关文件夹 三、Pycharm社区版安装详细步骤 四、Anaconda安装详细步骤 五、配置Pycharm 六、安装iflycode插件 Anaconda是一款集成的Python环境,anaconda可以看做Python的一个集成安装,安…

Openssl数据安全传输平台011:base64的使用

文章目录 1 base641.1 概念1.2 应用场景 2 base64 算法 (重要)3 openssl 中base64的使用3.1 BIO 操作3.2 base64 编码 -> bio链的写操作3.3 base64 解码 -> bio链的读操作 1 base64 1.1 概念 Base64是一种基于64个可打印字符来表示二进制数据的表…

聊聊“JVM 调优JVM 性能优化”是怎么个事?

所谓“调优”就是一个诊断和处理手段,最终的目标是让系统的处理能力,也就是“性能”达到最优化。 计算机系统中,性能相关的资源主要分为这几类: CPU:CPU 是系统最关键的计算资源,在单位时间内有限&#xf…

IDEA 断点高阶

一、按钮介绍 1.1 补充 返回断点处: 设置debug配置: 二、增加/切换debugger视图 三、window快捷键 所在行处: CtrlF8断点属性编辑: CtrlShiftF8 四、一些常用的高级功能 4.1 查看对象内存-Attach memory agent 1.勾选Atta…

react的table合并行时,出现border-bottom重复问题

背景: 需求是呈现一个表格,根据操作人跟操作时间是否相同来进行合并行数据 数据结构: 经过跟后端的同事商量,需要在每一行数据中返回rowSpanNum的值,前端在column中根据值来判断是否满足合并行(没有合并行…

基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 设置较大的干扰,PSNR15。 设置较小的干扰,PSNR25。 2.算法运行软件版本 matlab2022a vivado2019.2 3.部分核心程序 ti…

SDL窗口创建以及简单显示(1)

项目创建步骤 1. 使用Qt Creator创建一个C项目 2. 将SDL库文件放到源文件目录下 在项目pro文件中添加库文件 win32{INCLUDEPATH $$PWD/SDL2-2.0.10/includeLIBS $$PWD/SDL2-2.0.10/lib/x86/SDL2.lib } 使用SDL创建一个窗口 #include <stdio.h>#include <SDL.h>…

只需这个下毒小工具,让Stable Diffusion彻底崩溃!狗变猫,车变牛,AI侵权打响反击战

作者 | 谢年年 文生图模型如DALL-E、Midjourney和Stable Diffusion等越来越火热&#xff0c;只需要一句话几秒钟就可以生成质量不逊艺术家辛辛苦苦创作数月的图片。 艺术家们表示很气但又无能为力。 大模型研究测试传送门 GPT-4传送门&#xff08;免墙&#xff0c;可直接测试…

HCIA数据通信——交换机(Vlan间的通信与安全)

前言 之前的提到了交换机的概念和实验。不过交换机的一些功能还没有说完&#xff0c;我们的实验也仅仅是阻止相同地址段的IP地址互通&#xff0c;也没有用到子接口和路由器。显然&#xff0c;那样的配置过于简单。 端口安全 Port Security&#xff08;端口安全&#xff09;的功…

关于高并发你必须知道的几个概念

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录高并发必须知道的几个概念&#xff0c;如有出入还望指正。 关注公众…

Java-数据类型

Java-数据类型 一、字面常量二、数据类型&#xff08;1&#xff09;基本数据类型 三、变量1、变量概念2、语法格式&#xff08;1&#xff09;语法&#xff1a;&#xff08;2&#xff09;示例&#xff1a; 3、整型变量&#xff08;1&#xff09;整型变量&#xff08;int&#xf…

CentOS 搭建本地 yum 源方式 安装 httpd 服务

CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容&#xff1a; /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…

将Sketch文件转化为PSD文件的简单在线工具!

设计工作不仅需要UI设计工具&#xff0c;还需要Photoshop。常见的UI设计工具Sketch与Photoshop软件不兼容。如果你想在实际工作中完成Sketch转psd&#xff0c;你需要使用其他软件进行转换。但是在转换过程中容易丢失文件&#xff0c;导致同样的工作需要重复多次才能完成&#x…

OpenCV官方教程中文版 —— 2D 直方图

OpenCV官方教程中文版 —— 2D 直方图 前言一、介绍二、OpenCV 中的 2D 直方图三、Numpy 中 2D 直方图四、绘制 2D 直方图 前言 本节我们会学习如何绘制 2D 直方图&#xff0c;我们会在下一节中使用到它。 一、介绍 在前面的部分我们介绍了如何绘制一维直方图&#xff0c;之…

APP分发-CDN加速原理

摘要 CDN的全称是(Content Delivery Network)&#xff0c;即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0c;将网站的内容发布到最接近用户的网络”边缘“的节点&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的…

辅助驾驶功能开发-功能规范篇(23)-2-Mobileye NOP功能规范

5.2 状态机要求 5.2.1 NOP/HWP 状态机 NOP/HWP状态机如下所示: 下表总结了这些状态: 状态描述Passive不满足功能条件,功能无法控制车辆执行器。Standby满足功能条件。该功能不是由驾驶员激活的。功能不控制车辆执行器。Active - Main功能由驾驶员激活。功能是控制…

Qt 序列化函数和反序列化函数

文章目录 界面学生类序列化函数反序列化函数刷新所选择的下拉表值添加 界面 学生类 // 创建学生信息类 class studentInfo { public:QString id; // 学号QString name; // 学生姓名QString age; // 学生年龄// 重写QDataStream& operator<<操作符&…

传智书城源码+课程设计文档基于JSP+Servlet实现

下载地址: https://juzhendongli.store/commodity/details/19 包括源码参考论文

华为---DHCP中继代理简介及示例配置

DHCP中继代理简介 IP动态获取过程中&#xff0c;客户端&#xff08;DHCP Client&#xff09;总是以广播&#xff08;广播帧及广播IP报文&#xff09;方式来发送DHCPDISCOVER和DHCPREQUEST消息的。如果服务器&#xff08;DHCP Server&#xff09;和 客户端不在同一个二层网络(二…

哪一个更好?Spring boot还是Node.js

前言 本篇文章有些与众不同&#xff0c;由于我自己手头有些关于这个主题的个人经验&#xff0c;受其启发写出此文。虽然SpringBoot和Node.js服务于很不一样的场景&#xff0c;但是这两个框架共性惊人。其实每种语言都有不计其数的框架&#xff0c;但仅仅一部分是真正卓越的。如…