布隆过滤器解决缓存穿透

redis缓存穿透之终极解决方案——布隆过滤器 一.介绍与原理 在我们开发过程中,避免不了经常使用到redis这个缓存中间件,尤其是在大并发访问量的时候,他的存在会让我们在对数据库操作时节省很大的性能。 然而当我们进行redis的使用时,难免不了会发生以下这三种redis搞崩数据库的情况:缓存击穿、缓存穿透、缓存雪崩。而在遇到这几种情况时,我们都要有对应的解决措施去防止他的发生。今天我要记录的就是redis modle中的一种非常实用的解决缓存击穿的利器——布隆过滤器(bloomFilter)。 何为布隆过滤器呢?他的定义的使用定义很简... 阅读详情

一:概念

缓存穿透:查询一条不存在的数据,缓存中没有,则每次请求都打到数据库中,导致数据库瞬时请求压力过大,多见于爬虫恶性攻击

布隆过滤器:布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

原理:使用二进制数组,对要存入的key进行多次hash,分配到数组的不同位置,数组的值从0改成1,查询的时候也进行多次hash,命中到数组的位置的值都是1则key可能存在,如果有一个不是1则key一定不存在

在这里插入图片描述

布隆过滤器存在误判的情况,因为之前存入的key的hash值可能跟这次的一样,误判率一般设置为0.01,误判率越低,则执行的hash函数越多,执行效率越低

二:使用

1.引入redisson客户端依赖,配置文件中添加redis地址

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.17.3</version>
</dependency>


redisson:
  address: redis://ip:port
  password: password

2.配置redisson客户端

/**
 * redisson客户端使用Bloom过滤器拦截无效请求,解决缓存穿透
 * 项目初始化的时候初始化布隆过滤器(例如把商品编号都放进去),用户发过来的请求(带商品编号)先经过布隆过滤器过滤,过滤掉的返回null
 *
 */
@Configuration
public class RedissinConfig {


   @Value("${redisson.address}")
   private String addressUrl;


    @Value("${redisson.password}")
    private String password;


    @Bean
    public RedissonClient redissonClient() {
    Config config = new Config();
    config.useSingleServer()
    .setAddress(addressUrl)
    .setRetryInterval(5000)
    .setTimeout(10000)
          .setPassword(password)
    .setConnectTimeout(10000);
    return Redisson.create(config);
    }

   @Bean
   public RBloomFilter<String> bloomFilter(RedissonClient redissonClient) {
      RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom");
      bloomFilter.tryInit(1000000L, 0.01);
      return bloomFilter;
   }

}

3.项目启动后在监听器中初始化布隆过滤器

/**
 * @author shentong
 * @since 2022/3/8 9:34 PM 监听器,在项目启动的时候执行一些初始化操作
 */
@Slf4j
@Component
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {


   @Autowired
   private RBloomFilter bloomFilter;


   @Override
   public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
      try {
         log.info("项目启动了!!!!");
        
         bloomFilter.add("9");
         bloomFilter.add("6");
         bloomFilter.add("8");
      }
      catch (UnknownHostException e) {
         log.error(e.toString());
      }
   }
}

bloom过滤器初始化之后redis数据库中会产生一个hash值,和一个二进制数组

hash值
在这里插入图片描述

二进制数组
在这里插入图片描述

测试

/**
 * 布隆过滤器在监听器中已经初始化过,所以直接查询,7在bollom中不存在则直接过滤掉
 */
@Test
public void testBloom2() {
   if (!bloomFilter.contains("7")) {
      System.out.println("不存在key");
      return;
   }
   Object blooom = redisCache.getCacheObject("7");
   if (blooom != null) {
      System.out.println("从缓存中查到了数据");
   }
   else {
      System.out.println("从数据库中查到了数据");
      String bloom = "布隆过滤器";
      redisCache.setCacheObject("7", bloom);
   }
}

测试打印出 不存在key

如何redis中删除了key,或者添加了key,可以用定时器起一个线程查询redis中所有的key重新放到布隆过滤器中

Redis中如何使用布隆过滤器解决缓存击穿问题 使用布隆过滤器可以有效地预防 Redis 缓存穿透,提高应用程序的性能和稳定性。同时,使用 Redis 的事务也可以提高应用程序的可靠性和稳定性。在实际应用中,可以根据具体情况选择合适的缓存策略,以提高应用程序的性能和稳定性。 阅读详情

相关推荐

布隆过滤器介绍及实战应用(防止缓存穿透)

本文将讲解布隆过滤器的概念、原理、优缺点、使用场景;通过Java使用布隆过滤器,以及在项目中结合Redis使用,贴近实战,干货满满!!!

mlwsmqq的博客 4519

布隆过滤器解决缓存击穿问题

布隆过滤器

hauchun的博客 8263

布隆过滤器解决缓存穿透问题

背景 如果我们使用缓存,那样会带来缓存三大问题,缓存穿透、缓存雪崩、缓存击穿。这里针对缓存穿透并使用布隆过滤器解决。 缓存穿透就是有心用户利用缓存和数据库都必不存在的数据来发送恶意请求,从而绕过缓存,直接访问数据库,最终导致数据库崩溃的问题。 这是一个通用的问题,关键就在于我们怎么知道请求的 key 在我们的数据库里面是否存在,如果数据量特别大的话,我们怎么去快速判断。 这个问题是如何在海量元素中(例如 10 亿无序、不定长、不重复)快速判断一个元素是否存在。 这个问题涉及两个关键点:海量数据、快速判断。

qq_40837310的博客 7985

缓存穿透的解决方式?—布隆过滤器

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,查询时可以用来判断 “一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。布隆过滤器的空间效率O(m) 和查询时间O(k) 都很优秀,但是存在一定的误判率 (布隆过滤器认为不存在,则一定不存在;布隆过滤器认为存在,则只是可能存在)bit数组的位数m越大,hash函数的个数k越多,误判率就越低。

SevenCoding的博客 1515

使用布隆过滤器解决缓存穿透问题:Spring Boot 实战

缓存穿透是指查询一个不存在的数据时,由于缓存中没有命中,请求会直接打到数据库。如果攻击者频繁发起这样的请求,会导致数据库压力剧增,甚至崩溃。请求查询一个不存在的键。缓存中未命中,查询数据库也未找到,返回空结果。如果大量类似的请求涌入,数据库将成为瓶颈。通过布隆过滤器,我们可以有效解决缓存穿透问题,避免对数据库的无效查询。布隆过滤器以其高效的内存占用和快速的查询能力,成为分布式系统中不可或缺的工具。当然,布隆过滤器也有一定的误判率,因此在实际应用中需要根据业务需求权衡其准确性和性能。

是琼琼琼琼琼啊的博客 943

数字电路复位信号设计(异步复位、同步释放)笔记详解

复位信号设计(异步复位、同步释放)笔记详解 1 时序设计 1.1 复位信号设计(异步复位、同步释放) 1.1.0 复位恢复时间和清除时间 首先解释一下恢复时间(recovery time)和清除时间(removal time):(以复位信号低电平有效为例) 复位恢复时间(recovery time):撤销复位时,复位信号无效到时钟有效沿来临之间需要维持的最小的时间,类似于同步时钟的建立时间setup time; 复位清除时间(removal time):复位时,在时钟有效沿来临之后复位信号还需要保持复位

weixin_42294124的博客 1万+

【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

缓存穿透是指在使用缓存机制时,大量的请求无法从缓存中获取到结果,导致请求都要直接访问后端存储系统,从而增加了系统的负载和响应时间。通常的缓存机制是将请求的结果缓存在内存或其他高速存储介质中,当相同的请求再次到达时,可以直接从缓存中获取结果,避免了从后端存储系统中读取数据的开销。然而,在缓存穿透的情况下,由于大量请求所对应的数据在缓存中不存在,每个请求都需要直接访问后端存储系统。这可能是因为恶意请求、频繁的随机查询或者查询不存在的数据等原因。

小吉妙妙屋 4893

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2206

Redis的缓存穿透及解决方法——布隆过滤器BloomFilter

目录 1. Redis概述: 2. Redis的主要应用场景: 3. 缓存穿透及布隆过滤器 (1)缓存穿透(大量查询一个不存在的key)定义 (2)解决方法 ps:布隆过滤器原理 ps:布隆过滤器另一个用途——推荐去重 1. Redis概述: Redis是一个开源的Key-Value存储系统,其中Value支持String、list、set、hash、zset五种数据结构,这些数...

攻城狮Kevin 3万+

基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践

本文聚焦企业级报告生成场景中 “在线编辑模板 + 动态数据填充” 的核心需求,详细阐述基于 POI-TL、OnlyOffice 与 MinIO 的全栈实现方案。通过代码示例拆解模板加载、文字填充、图表匹配渲染(含通过关系 ID 关联图表与段落的关键逻辑)、报告存储全步骤。最终通过技术组合实现业务人员可视化编辑模板、后端高效填充数据的目标,为同类动态 Word 生成需求提供可复用的实践参考。

imHanweihu的博客 1861

Linux Wireless之80211(nl80211, cfg80211, mac80211)

Linux Wireless之80211(nl80211, cfg80211, mac80211)前言在Linux无线子系统中,cfg80211、mac80211和nl80211是三个关键的组件,它们共同工作以实现对802.11设备的配置和管理。cfg80211负责内核空间的通用API,mac80211负责具体的MAC层实现,而nl80211则作为用户空间与内核空间之间的桥梁,用于配置管理和通信。Netlink 是一个 Linux 中的 socket 类型,用于在内核与用户空间之间传递事件。

DD'Notes 1478

Redis服务之缓存穿透、缓存击穿、缓存雪崩、解决办法、简述布隆过滤器

文章目录Redis服务一、缓存穿透1. 什么是缓存穿透?2. 解决办法二、缓存击穿1. 什么是缓存击穿?2. 解决办法三、缓存雪崩1. 什么是缓存雪崩?2. 解决办法 Redis服务 一、缓存穿透 1. 什么是缓存穿透? 为了缓解持久层数据库的压力,在服务器和存储层之间添加了一层缓存; 一个简单的正常请求:当客户端发起请求时,服务器响应处理,会先从redis缓存层查询客户端需要的请求数据,如果缓存层有缓存的数据,会将数据返回给服务器,服务器在返回给客户端;如果缓存层中没有客户端需要的数据,则会去底层存储层查

Pluto.的博客 4233

YOLOv8+BiFPN双向特征金字塔:多尺度目标检测精度提升28%的实战教程

双向特征金字塔网络(BiFPN)是一种强化多尺度特征融合支持“自顶向下+自底向上”的双向特征流动,同时保留不同尺度的细节信息;引入加权融合机制,自动学习不同特征的重要性权重;裁剪冗余节点,在轻量化的同时提升融合效率。

m0_64661770的博客 492

彻底理解布隆过滤器怎么解决缓存穿透问题

在谈布隆过滤器之前,需要先了解Bitmaps,它是Redis的一种高级数据结构。定义:Bitmaps(位图)是一种数据结构,用于表示一个由二进制位(bit)组成的集合,每个二进制位的值可以是 0 或 1,通常用于表示某些状态或者集合中元素的存在与否,位图在内存中高效地存储和操作大量的布尔值(即 0 或 1),因此在许多场景中,特别是在高效存储和查找时,具有非常重要的应用。比如现在要去存一个1 3 5 7,在BitMap里面怎么表示?

BestandW1shEs_lsy的博客 2521

什么是 AIDV(AI 定义汽车):从软件定义到智能决策的范式革命

AI定义汽车(AIDV),是指以人工智能(尤其是大模型、深度学习、强化学习)为核心引擎,以车载AI芯片为算力底座,以“数据闭环”为迭代支撑,重构汽车感知、决策、执行全链路,实现“感知智能化、决策自主化、体验个性化、迭代自动化”的新一代智能汽车发展范式。其核心是让汽车从“执行工具”升级为“具备自主学习与智能决策能力的移动智能终端”,核心价值是“车与人的深度协同”与“复杂场景的自主适配”。

getusushu的博客 95

MATLAB船舶开尔文尾迹三维仿真建模

开尔文尾迹介绍 Kelvin最早研究舰船在水面运动在水面上形成波纹的原理,主要针对静水中点源运动的尾迹问题,并给出尾迹的张角和波高分布情况。由 Kelvin 的理论,一般情况下假设由一个理想点源来代替舰船,开尔文尾迹由分歧波和横断波组成,分歧波向船的两侧扩散,而横断波主要向船的后方传播,在相遇的地方两波相干形成尖头波,且尖头波位于尾迹角16°到19.5°之间,又因为尖头波波长过短,以至于无法单独的区分出每个尖头波的波前,所有的波前在视觉效果上就连成一条直线表现为亮线,称为开尔文臂,开尔文臂以船身对称,且角度

qq_19512613的博客 3844

基于布隆过滤器解决缓存穿透问题

一、缓存穿透 产生的背景: 缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都要穿透到后端数据库查询,使得数据库的压力非常大,甚至导致数据库服务压死; 解决方案: 1.接口层实现api限流、用户授权、id检查等; 2.从缓存和数据库都取不到数据的话,一样将数据库空值放入缓存中,设置30s有效期避免使用同一个id对数据库攻击压力大; 二、布隆过滤器基本介绍 布隆过滤器适用于判断某个数据是否在集合中存在,不一定百分百准备, Bloom Filter基本实现原理采用位数组与联合

记录各种Bug解决案例及日常学习内容 2920

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

redis缓存穿透解决之布隆过滤器

布隆过滤器

服务员的博客 1707

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

布隆过滤器解决Redis缓存穿透

一、Redis缓存穿透 缓存穿透:恶意查询一个数据库中不存在的数据,去缓存层中没有命中数据,进而去mysql中查询数据。 缓存null值,可能会导致Redis中缓存一堆null值。 二、过滤器解决缓存穿透 使用过滤器解决,把不存在的key的请求,拦截住。 问题,key都缓存到内存中,导致内存紧张。 三、布隆过滤器解决缓存穿透 3.1 什么情况下需要布隆过滤器 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经.

Jak的博客 1102

Bloom Filter布隆过滤器(解决redis缓存穿透)

1.布隆过滤器: 布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定,链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。 比如: 链表O(n), 树O

MrYushiwen的博客 6223

如何解决缓存穿透?你可以考虑空值回种、布隆过滤器

本文针对缓存穿透问题,分析了两种解决方案。缓存穿透指无效请求绕过缓存直接访问数据库,导致数据库压力过大。解决方案一是空值回种:当数据库查询为空时,将空值写入缓存并设置较短过期时间,简单易行但可能污染缓存。解决方案二是布隆过滤器:通过概率型数据结构预判请求有效性,空间效率高但存在误判可能。两种方案各有优劣,空值回种适合少量无效请求场景,布隆过滤器则适用于大规模防御。实际应用中可组合使用,通过多层防护确保系统稳定。

分享Java、Python、AI相关技术以及面试技巧 1023

使用布隆过滤器解决缓存穿透

使用布隆过滤器解决缓存穿透

qq690452074的专栏 3785
上一篇: Mysql 实现读写分离(主从复制)
下一篇: 搭建Harbor镜像私服
livel_java
博客等级 码龄9年 2916粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值