Redis布隆过滤器的原理和应用场景,解决缓存穿透
目录
一、redis
二、布隆过滤器
三、缓存穿透问题
四、布隆过滤器解决缓存穿透

一、redis
Redis(Remote Dictionary Server)是一种开源的内存数据存储系统,也是一个使用键值对(Key-Value)方式的高性能数据库。Redis以其快速、灵活和丰富的数据结构而闻名,常用于缓存、队列、实时数据分析等场景。
Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。这些数据结构使得Redis能够满足各种需求,如缓存数据、计数器、排行榜、发布订阅等。
Redis具有以下几个关键特点:
-
内存存储:Redis将数据存储在内存中,因此读写速度非常快。它支持持久化到磁盘,以确保数据的持久性。
-
高性能:Redis使用单线程模型,避免了多线程的竞争和上下文切换开销,从而提供了极高的性能。此外,Redis还通过使用异步I/O和高效的数据结构等手段进一步提升了性能。
-
多功能性:Redis不仅仅是一个简单的键值存储,还支持丰富的功能,如事务、发布订阅、Lua脚本等。这些功能使得Redis能够在各种场景下发挥作用。
-
高可用性:Redis支持主从复制和哨兵机制,以提供高可用性和故障恢复能力。当主节点发生故障时,Redis能够自动将从节点提升为主节点,并继续提供服务。
总的来说,Redis是一个功能丰富、高性能的内存数据库,适用于各种场景,如缓存、消息队列、实时数据处理等。其简单易用的接口和灵活的数据结构使得开发者能够快速构建高效可靠的应用系统。
二、布隆过滤器
布隆过滤器(Bloom Filter)是一种概率型的数据结构,用于判断一个元素是否可能存在于一个集合中,具有高效的查询和存储特性。它基于位数组和一系列哈希函数构建,可以对元素进行快速的插入和查询操作。
布隆过滤器的原理是通过多个哈希函数将元素映射到位数组的不同位置上。当一个元素被插入时,对应的位数组位置被标记为1。判断一个元素是否存在时,会对元素进行相同的哈希映射操作,如果所有对应的位数组位置都为1,则可能存在于集合中;如果有任何一个位数组位置为0,则一定不存在于集合中。
布隆过滤器的主要优点是空间效率高和查询速度快。因为它只需要使用少量的空间来存储位数组,而且查询操作只需要进行位数组的读取,时间复杂度为O(1)。另外,布隆过滤器可以容忍一定的误判率,即可能会将不存在的元素判断为存在,但不会将存在的元素判断为不存在。
然而,布隆过滤器也有一些缺点。首先,它无法删除已插入的元素,因为删除会影响到其他元素的判断结果。其次,随着元素数量的增加,误判率会逐渐上升。因此,在设计布隆过滤器时需要合理选择位数组大小和哈希函数的数量。
布隆过滤器常用于需要快速判断元素是否存在的场景,如缓存穿透、URL去重、反垃圾邮件等。它可以在很小的空间开销下,提供高效的元素存在性判断,减少了对实际数据存储的依赖和查询的时间开销。

三、缓存穿透问题
缓存穿透是指在使用缓存系统时,某个请求查询的数据在缓存中不存在,导致请求直接访问数据库或其他存储系统,从而增加了请求的响应时间和系统的负载。当恶意用户或非法攻击者故意查询不存在的数据时,可能会引发缓存穿透问题。
具体来说,缓存穿透问题发生的步骤如下:
- 用户发送一个查询请求,该请求对应的数据在缓存中不存在。
- 缓存系统接收到请求后,首先检查缓存中是否存在对应的数据。如果不存在,则需要从数据库或其他存储系统中获取数据。
- 由于查询的数据在存储系统中也不存在,缓存系统无法将数据写入缓存,直接返回查询结果为空。
- 用户发起的大量查询请求都会导致缓存系统频繁查询数据库,增加了数据库的负载和查询时间。
缓存穿透问题对系统的影响主要包括两个方面:
- 响应时间延迟:由于缓存无法命中,每次都需要访问数据库或其他存储系统,导致响应时间变慢。
- 系统负载增加:大量的缓存穿透请求会直接落到存储系统上,增加了存储系统的负载,可能导致性能下降甚至崩溃。
为了解决缓存穿透问题,常见的方法包括:
- 布隆过滤器(Bloom Filter):使用布隆过滤器来过滤掉不存在的数据,减轻对存储系统的压力。
- 空值缓存:当发现某个查询结果为空时,将空结果也缓存起来,避免重复查询。
- 热点数据预热:将热点数据提前加载到缓存中,降低缓存穿透的概率。
- 异步加载:当查询结果不存在时,可以使用异步的方式去加载数据,避免阻塞查询线程。
- 限制恶意请求:对于频繁查询不存在数据的请求,可以进行限制或封禁,以防止恶意攻击。
通过以上措施,可以有效地减少缓存穿透问题的发生,提高系统的性能和稳定性。

四、布隆过滤器解决缓存穿透
使用布隆过滤器可以有效地解决缓存穿透问题。下面是使用布隆过滤器来解决缓存穿透问题的步骤:
-
创建布隆过滤器:根据预估的数据量和期望的误判率,创建一个合适大小的布隆过滤器。布隆过滤器的大小取决于预期存储的数据量和所允许的误判率。
-
初始化布隆过滤器:将缓存中已存在的数据添加到布隆过滤器中。这样,在后续的查询中,如果查询的数据在布隆过滤器中不存在,就可以直接返回不存在,而不需要访问存储系统。
-
查询数据:在每次查询之前,先使用布隆过滤器判断查询的数据是否已经存在于布隆过滤器中,如果不存在,则可以直接返回查询结果为空,避免了对存储系统的访问。
-
数据写入缓存:当从存储系统获取到数据后,需要将数据写入缓存中,并同时将数据添加到布隆过滤器中,以保证下次查询时可以命中缓存。
需要注意的是,由于布隆过滤器的特性,存在一定的误判率,即有可能将实际不存在的数据误判为存在。为了避免这种情况,可以将布隆过滤器作为缓存的一个辅助工具,仍然需要进行实际的数据验证,例如在缓存层之上再添加一层校验,从存储系统获取数据并验证其真实性。
通过使用布隆过滤器,可以在缓存层面上快速判断数据是否存在,避免了对存储系统的频繁访问,提高了系统的性能和响应速度,有效解决了缓存穿透问题。
相关文章:
Redis布隆过滤器的原理和应用场景,解决缓存穿透
目录 一、redis 二、布隆过滤器 三、缓存穿透问题 四、布隆过滤器解决缓存穿透 一、redis Redis(Remote Dictionary Server)是一种开源的内存数据存储系统,也是一个使用键值对(Key-Value)方式的高性能数据库。Red…...
数据结构中的英文缩写和易忘的专有名词
树与二叉树 满二叉树:每层的节点数都是该层能取到的最大值完全二叉树:在满二叉树的基础上,去掉最下层右面的一些连续叶子节点所形成的二叉树AVL:平衡二叉树。树中任意节点的左子树和右子树高度之差的绝对值不超过1的二叉排序树称…...
Unity C# 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息
Unity C# 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息 目录 Unity C# 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 一、简单介绍 Unity中的一些知…...
MODBUS TCP转CCLINK IE协议网关cclink通讯异常的处理方法
你是否曾经遇到过需要将不同的设备连接到一个统一的网络中?或者你是否曾经遇到过设备之间的通讯协议不兼容的问题?捷米的JM-CCLKIE-TCP通讯网关就是为解决这些问题而设计的。 JM-CCLKIE-TCP通讯网关是一款自主研发的CCLINK IE FIELD BASIC从站功能的通讯…...
linux中的ifconfig和ip addr
在linux操作系统中ifconfig和ip addr都是显示网卡配置信息的命令,好多人有疑惑它们有什么区别呢 区别1:对于linux发行的版本不一样 ip addr是对新发行版本的linux使用会比较多;而ifconfig是老版本遇到使用的会比较多。 区别2:显…...
图像多目标跟踪
目标跟踪(Object Tracking)是自动驾驶中常见的任务,根据跟踪目标数量的不同,目标跟踪可分为: 单目标跟踪(Single Object Tracking,SOT)多目标跟踪(Multi-Objects Tracki…...
42 | 航空公司客户价值分析
民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争。 目前航空公司已积累了大量的会员档案信息和其乘坐航班…...
第三章 图论 No.11二分图,匈牙利算法与点覆盖
文章目录 二分染色:257. 关押罪犯增广路径372. 棋盘覆盖 最小点覆盖376. 机器任务 最大独立集378. 骑士放置 最小路径点覆盖 二分染色:257. 关押罪犯 257. 关押罪犯 - AcWing题库 最大最小问题,一眼二分 答案的范围在 [ 1 , 1 e 9 ] [1, 1…...
Die2Die(D2D)和chip2chip(C2C)之间的高速互联接口
随着chiplet的兴起,Die2Die的高速互联越来越重要,相比于传统的C2C(chip2chip)的互联,D2D的片间距离很近(10mm量级),且这些小的chip(裸片)最终形成一个封装【多芯片模块(MCM)】。所以D2D的互联信道短&#x…...
JAVA设计模式汇总
文章目录 一、设计模式分为三大类二、设计模式的六大原则三、汇总 一、设计模式分为三大类 创建型模式共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式…...
【实战讲解】数据血缘落地实施
在复杂的社会分工协作体系中,我们需要明确个人定位,才能更好的发挥价值,数据也是一样,于是,数据血缘应运而生。 今天这篇文章会全方位的讲解数据血缘,并且给出具体的落地实施方案。 一、数据血缘是什么…...
Java课题笔记~ ServletContext
单个Servlet的配置对象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…...
设备取电芯片LDR6328Q
2021年5月,USB-IF 协会发布了全新的USB PD3.1规范,该规范将快充功率上限从100 W提升至240W(支持Extended Power Range,简称EPR)。充电功率的提升也让USB PD的应用从手机、笔记本电脑,扩展到便携式设备、物联…...
Redis 事务、持久化、复制原理分析
Redis 事务、持久化、复制原理分析 一、Redis 简介1.1 Redis1.2 Redis 事务 二、Redis 事务机制2.1 事务基本概念2.2 Redis 事务操作2.2.1 开启事务2.2.2 批量执行命令2.2.3 事务提交与回滚 三、Redis 持久化机制3.1 持久化机制基本概念3.2 Redis 持久化方案3.2.1 RDB 持久化3.…...
初识鸿蒙跨平台开发框架ArkUI-X
HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景&#…...
uniapp开发小程序-分包(微信错误码:800051)
在使用uniapp开发小程序时,上传的时候因为文件过大,显示上传失败。 以下是开发过程中遇到的问题及解决方法: 1. 问题一:因为文件过大,显示上传失败 ①尝试过把本地使用的图片压缩到最小; ②把图片转换为网…...
n-皇后问题
希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 不清楚蓝桥杯考什么的点点下方👇 考点秘籍 想背纯享模版的伙伴们点点下方👇 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不能错过的模板大全…...
JS如何向数组中添加数组
常见的办法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…...
串口通信收发项目级一
void 定时器中断函数入口(void) { if(判断是否为定时器中断) { static uint16_t num定义静态变量; static uint8_t index定义静态变量; unsigned char buff_busy定义局部变量; if(串口中断接收数据数量>静态变量) { 静态变量串口中断接收数据数量; } else if(静态变量串口中…...
设计模式之七:适配器模式与外观模式
面向对象适配器将一个接口转换成另一个接口,以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...
[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...
Async-profiler 内存采样机制解析:从原理到实现
引言 在 Java 性能调优的工具箱中,async-profiler 是一款备受青睐的低开销采样分析器。它不仅能分析 CPU 热点,还能精确追踪内存分配情况。本文将深入探讨 async-profiler 实现内存采样的多种机制,结合代码示例解析其工作原理。 为什么需要内…...
C++.OpenGL (9/64)摄像机(Camera)
颜色(Color) 颜色理论在OpenGL中的应用 #mermaid-svg-dKNDfS4EKDUmG4Ts {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-icon{fill:#552222;}#mermaid-svg-dKNDfS4EKDUmG4Ts .error-text…...
