✅技术社区--布隆过滤器在项目中怎么用的?不用可以吗?

使用 布隆过滤器 一般就是用于快速判断某个元素是否在集合中出现了,可以用于解决 缓存穿透 的问题,布隆过滤器提供 一组哈希函数 h1, h2, ..., hk ,对需要存储的数据使用哈希函数计算得到 k 个哈希值,将 BitMap 中这 k 个位置都设置为 1,如果这 k 个位置都是1,则 可能 在集合中,但是如果都不是1,则 一定不在 集合中

因此布隆过滤器会出现 误判 ,可能将不在集合中的元素判断为在集合中,可以通过 增加数组长度 来降低误判率

缓存穿透: 请求的数据在数据库中不存在,因此数据也不会在缓存中,每次请求都不会命中缓存,而是打到数据库上,也就是直接穿过缓存打到数据库中,导致数据库压力很大甚至崩溃,这就是缓存穿透

那么缓存穿透的话,可以使用 Redis 的 布隆过滤器 来解决:下载 RedisBloom 插件,该插件是 Redis 的布隆过滤器模块,下载之后在 Redis 的 conf 文件中配置之后即可使用

具体解决缓存穿透的场景 的话,这里举一个例子: 用户注册场景 ,如果系统用户量很大,在用户注册的时候,需要判断用户的用户名是否重复,初始将用户名的信息都初始化在布隆过滤器中,那么在用户注册时,先去布隆过滤器中快速进行判断用户名是否已经被使用,如果经过 k 次哈希计算发现这 k 次哈希值的位置上都为 1,说明 该用户名可能已经被使用了 ,用户注册用户名重复的话,大不了就换一个用户名就好了,这种情况是可以容忍的,之后用户注册成功之后,再将注册成功的用户名也放入的布隆过滤器中,这样在 用户注册时可以通过布隆过滤器快速判断用户名是否重复

上边说了布隆过滤器可能存在 误判 的情况,误判是可以容忍的,但是布隆过滤器解决缓存穿透还存在另外一个缺点:无法删除元素

无法删除元素 会导致如果用户注销帐号了,那么该用户名是无法从布隆过滤器中删除的,因此会导致其他用户也无法注册这个用户名,可以考虑再添加一层 Redis 缓存 来存储已经注销的用户名,同时如果注销的用户名较多的话,可能存在 大 key 问题 ,可以考虑分片存储来解决

这里总结一下如何通过 布隆过滤器解决缓存穿透:

首先将用户名都初始化在布隆过滤器中,用户注册的时候通过 布隆过滤器 快速判断该用户名是否已经被使用了,系统可以容忍一定的误判率,对于布隆过滤器无法删除元素这个缺点,添加一层 Redis 缓存,将已经注销的用户名放在这个 Redis 中的 set 里,这样就可以解决布隆过滤器无法删除元素的缺点了,不过如果注销用户名多了,可能会存在大 key 的问题,因此要考虑 分片存储 解决大 key 问题,也可以从业务角度上,限制每个用户注销的次数

image-20240402160348220

最后再说一下布隆过滤器中容量的计算:

先说一下各个参数的含义:

  • m: 布隆过滤器中二进制 bit 数组的长度
  • n :需要对多少个元素进行存储,比如说我们要存储 1000 万个用户名,那么 n = 1000 万
  • p: 期望的误判率,可以设置 p = 0.001(%0.1) 或者 p = 0.0001(%0.01)

将 n、p 带入上述公式即可计算出来理想情况下布隆过滤器的二进制数组的长度,也可以根据此公式算出来存储这么多元素大概需要占用多少内存空间,比如需要存储 10 亿个用户名,期望误判率为 0.001,也就是将 n = 10亿、p = 0.001 带入,得到 m 约为 1.67GB ,因此这个布隆过滤器大约占用 1.67GB 的空间(可以搜索在线布隆过滤器容量计算)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试stm32基础知识

1.ISP 第一步进入bootloader模式:先置BOOT0为高,BOOT1为低,再复位单片机进入bootloader模式,之后通过上位机下载程序; 第二步配置启动代码的地方:代码下载完毕后,置BOOT0为低,BOOT1…

中兴F7607P自启动程序,关闭JAVA插件

本文目的:关闭光猫内自动运行的JAVA插件,并实现开机自动调用用户的程序启动 移动定制版F7607P不带LXC容器,取而代之的是JAVA虚拟机,内置多个插件,包括名为CMCCDPI的插件,用途可以从名字上窥见。机器rootfs分…

Windows系统下查看C语言文件反汇编

一、配置编译器环境变量 1.下载mingw64 MinGW 的全称是:Minimalist GNU on Windows ,MinGW 就是 GCC 的 Windows 版本 。 MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成32位可执行程序,而 MinGW-w64 则可以编译生成 64位 或 32位 可执行…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题:为什么使用 FinalShell 连接&#xff0…

字符串拆分优化算法

字符串拆分优化算法 问题背景算法设计思路伪代码实现C语言代码实现 详细解释结论 在面对字符串拆分问题时,我们的目标是找到一种最优的拆分顺序,以使得总的拆分代价最小。这个问题可以通过动态规划算法来解决。在本文中,我们将详细介绍这个问…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户,然后通过本地电脑telnet 软件ensp中的设备,尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

python数据可视化:折线图plt.plot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化: 折线图 plt.plot() 选择题 关于以下代码输出的结果说法正确的是? import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans…

2011年认证杯SPSSPRO杯数学建模C题(第二阶段)你的爱车入保险了吗全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 C题 你的爱车入保险了吗 原题再现: 近几年,国内汽车销售市场异常火爆,销售量屡创新高。车轮上的世界,保险已经与我们如影随形。汽车保险,简称车险,是指对机动车辆由于自然…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想,对于两个有序数组,我们分别取他们首元素比较大小,取小的插…

向量数据库Chroma初步了解学习记录

目录 前言 一、Chroma是什么? 二、使用步骤 1.安装 2.连接Chroma 内存模式 client模式 Server模式 3.创建数据集 4.写入数据 5.查询数据 6.完整代码 7.更多参考 三、瞅瞅chroma之sqlite 总结 前言 大模型很强大,但是大模型也存在知识的局…

格灵深瞳,实现核心能力高强度保护与灵活交付

格灵深瞳,AI领域的领先企业,借助泰雷兹圣天诺技术,实现核心能力高强度保护与灵活交付,引领行业风向,安策信息助力AI行业企业实现产品核心能力保护、销售模式创新以及软件产品的灵活交付。 格灵深瞳,AI领域的…

量子密钥分发系统的设计与实现(二):光路子系统初步讨论

通过上一篇文章,我们对量子密钥分发系统的基本架构、硬件结构以及密钥分发流程进行了初步的总体介绍,从本文开始,我们就基于系统顶层的架构设计,开始从模块到器件,从硬件到软件开始详细讨论QKD系统的设计与实现。本文主…

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取,首先我们打开猫眼 接着我们想要进行数据抓包,就要看网站的具体内容,通过按F12…

注塑机自动喷雾程序 报警自动关机

/***参数设置,开模数计数,秒脉冲计时***************/ /***实现功能:检测报警信号,脱模剂开模数计数信号***/ /***参数:1:脱模剂开模数 2:喷雾时间 3:延时时间 ***/ /***串口接收触摸屏参数设置字符串,接收并保存******/ /***端子输入口读开模数,比较设定值后输出到电磁阀**/ /…

Emmet表达式

目录 Emmet语法简介 Emmet作用 Emmet在HTML中的使用 Emmet在CSS中的使用 Emmet语法简介 Emmet语法的前身是Zen coding,它使用缩写,来提高HTML的编写速度,VScode内部已经集成该语法。 Emmet作用 快速生成HTML结构语法快速生成CSS样式语法 Emmet在HTML中的使用…

python连接数据库失败怎么解决

Python 连接数据库失败怎么解决? 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。…

Vue_管道符“|”(单竖线)的用处

目录 1、管道符是什么 2、应用场景 背景:项目中偶遇在 {{ }} 插值表达式里用了 “|”此写法,一开始误以为是写错了,应该是写成 “||” 双竖线( 逻辑或运算符 ),结果询问…

为什么用云渲染农场?3D云渲染农场助力影视动画行业发展

​计算机图形技术的进步使得3D渲染成为多个产业发展的重要推动力。设计师和艺术家利用这项技术将创意实现,创造出震撼的视觉作品。但是,高质量的渲染需要大量的计算资源。云渲染农场通过提供这些资源,有效提高了渲染的速度和效率,…

DRF 序列化类serializer单表

【五】序列化类serializer单表 【1】主要功能 快速序列化 将数据库模型类对象转换成响应数据,以便前端进行展示或使用。这些响应数据通常是以Json(或者xml、yaml)的格式进行传输的。 反序列化之前数据校验 序列化器还可以对接收到的数据进行…

学习 Rust 的第六天:所有权问题

大家好, 欢迎来到学习 Rust 的第 6 天,过去 5 天我们学到的内容在几乎每种语言中都是一样的。所有权是 Rust 的一个独特概念。 介绍 所有权是一种独特的内存管理系统,其中每个值都有一个指定的所有者,在所有者超出范围时自动释…