【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透

2023-11-11

   springboot篇章整体栏目: 


【一】springboot整合swagger(超详细

【二】springboot整合swagger(自定义)(超详细)

【三】springboot整合token(超详细)

【四】springboot整合mybatis-plus(超详细)(上)

【五】springboot整合mybatis-plus(超详细)(下)

【六】springboot整合自定义全局异常处理

【七】springboot整合redis(超详细)

【八】springboot整合AOP实现日志操作(超详细)

【九】springboot整合定时任务(超详细)

【十】springboot整合redis实现启动服务即将热点数据保存在全局以及redis(超详细)

【十一】springboot整合quartz实现定时任务优化(超详细)

【十二】springboot整合线程池解决高并发(超详细,保你理解)

【十三】springboot整合异步调用并获取返回值(超详细)

【十四】springboot整合WebService(超详细)

【十五】springboot整合WebService(关于传参数)(超详细)

【十六】springboot整合WebSocket(超详细)

【十七】springboot整合WebSocket实现聊天室(超详细)

【十八】springboot实现自定义全局异常处理

【十九】springboot整合ElasticSearch实战(万字篇)

【二十】springboot整合过滤器实战

【二十一】springboot整合拦截器实战并对比过滤器

【二十二】springboot整合activiti7(1) 实战演示篇

【二十三】springboot整合spring事务详解以及实战

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十六】springboot实现多线程事务处理_springboot多线程事务

【二十七】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能 


98dab77ec5c20a2f442e2f45b115d7b7.png

        本章来学习记录一下关于缓存三大典型问题其一的缓存穿透的基本解决方式:通过布隆过滤器以及设置null值

        为了实现这一demo,需要整合jedis和redisson,所以本文主要会从下面几个方面开始讲述:

  • springboot整合Jedis
  • springboot使用Redis的两种方式(Jedis和Redistemplate)
  • springboot整合Redission布隆过滤器
  • springboot使用布隆过滤器的四种方式(设置到redis内,手写,Redission,Guava)
  • 编写代码测试缓存穿透

qq交流群导航——>231378628


目录

一、什么是缓存穿透

二、怎么解决缓存穿透

三、springboot怎么使用Redis

四、springboot怎么使用布隆过滤器

五、springboot整合Jedis

六、springboot整合Redisson

六、准备demo所需

七、测试


一、什么是缓存穿透

        首先本文的目的就是学习怎么通过布隆过滤器解决缓存穿透,那么缓存穿透是什么呢,大致如下图。

99f5389066494258a7f470339466e942.png

        为了解决数据库的压力问题,引入了缓存这一东西,将某些数据存入缓存后,接口直接从缓存取值,从而减轻数据库的压力。当客户端访问的数据在缓存中不存在时,就会到数据库查询,查到了再存入缓存,而缓存击穿就是恶意攻击,一直访问数据库中不存在的数据,导致直接穿过缓存,每次都击中数据库。


二、怎么解决缓存穿透

        解决缓存穿透的方式可以通过布隆过滤网和空值设置法,本文会将两种方法都使用到。

1、布隆过滤器:可以理解为就是一个普通的过滤器拦截器,将数据通过add方法存入过滤器之后,通过它提供的contains方法判断是否存在某个值,返回值也是true或者false,详细的自己百度一下。他会有一定的误差(返回true,表示不一定存在;返回false,表示一定不存在),但是我认为解决缓存穿透可以不用考虑这个问题,因为只需要确认它一定不存在就可以了。具体使用时,在项目启动时可以查询数据库,将所有需要缓存的数据存入过滤器,每次接口调用时,通过它先判断一遍,存在后再走后面的逻辑(查缓存、查数据库)。

5db6bf13bc8c42c3913b2afdad225816.png2、空值设置法:查询数据库时,若不存在该数据,设置一个过期时间短的缓存到redis,下次到缓存查询时就能查到该值,并直接返回对应的value值null,设置一个较短的过期时间是为了以防后面该值被误处理,一直查询处于空值,还有就是可能会出现大量的处于null值的缓存,占用缓存资源。

41922f54b11a46f4bbb08c286d7eb2a5.png

 3、综上,本次demo的缓存穿透解决方式,如下(综合两种方式):

a18ad18a83e743da97941a45668831f2.png


三、springboot怎么使用Redis

        上面已经讲了如何解决缓存穿透,这小节就介绍一下,一般springboot怎么使用redis呢?很简单,通常有两种方式,一种是RedisTemplate,一种是Jedis。

  • RedisTemplate:RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
  • Jedis:Jedis是Redis官方推荐的面向Java的操作Redis的客户端。

        原生jedis效率优于redisTemplate。

        前面有一章已经整合过 redisTemplate方式使用redis了,感兴趣的可以看看。【七】springboot整合redis(超详细)_

         所以后面在这次demo中会使用jedis来操作redis。

四、springboot怎么使用布隆过滤器

        springboot使用布隆过期器也有多种方式,比如使用谷歌的Guava

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
</dependency>

         或者使用redis提供的redisson

 <dependency>
     <groupId>org.redisson</groupId>
     <artifactId>redisson</artifactId>
</dependency>

        本次demo将会集成redisson的方式使用布隆过滤器。

五、springboot整合Jedis

        整合Jedis的方式很简单,直接引入依赖,配置好连接就可以了,如下: 

1、引入依赖

2964a9a3c68645ca847c45621b8691a3.png

2、新建配置文件(反正是学习,将配置写死在代码内也行)

05e291d5e9214785aabae3fd27180f28.png

3、编写redis配置文件(关于jedis的,后面会将redisson的也写在这个配置文件,我为了简便,通用配置信息)

13489fafee094585bcdcc97480efb758.png

        通过ResourceBundle配合静态块,将配置信息读取到并设置到jedis连接池进行创建连接池。

PS:也可以不使用连接池,直接使用Jedis,但是那样的话,会每次连接都会创建新的Jedis对象,推荐使用连接池的方式,类似数据库的连接池。

        然后通过 Jedis jedis = jedisPool.getResource();就可以得到Jedis对象,就可以通过Jedis提供的Api方法进行redis的操作了。

六、springboot整合Redisson

        上面整合了Jedis,下面进行最后Redisson的整合,依旧是引入依赖,然后连接上缓存,再通过Redisson创建布隆过滤器即可。

1、引入依赖

c9869241b6bb4cf19331baf77c0be7a0.png

2、修改redisConfig(上面创建的配置文件,新增redisson的连接,以及布隆过滤器的创建)

5909a41830c64cccb402bf8be573bff9.png

PS:文章最开始提过布隆过滤器是有误差率的,所有在创建时会有参数来控制这个误差率,

91bc630d8a83437e845569821c42e858.png

第一个参数代表大小,第二个参数代表容错率,具体的就不提了,百度学习吧。 

再提一嘴,上述的bean要保证单例,要么自己实现或者交给spring管理就可以了,spring创建的bean默认是单例的。

六、准备demo所需

        本小结,介绍一下本次demo最后需要的准备,本章的ORM框架使用的是Mybatis-plus,前面也有讲过具体的使用【四】springboot整合mybatis-plus(超详细)

        所以需要创建mapper层等代码。 

1、创建数据库表

CREATE TABLE `product` (
  `pid` int NOT NULL AUTO_INCREMENT,
  `productName` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `price` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=253 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

2、随便导入几百条数据

6ca221ae15cc426fab1066ae222d69c8.png

3、创建实体映射类

18868bed474d42d59e4a85336ca68f23.png

4、创建mapper层

e493ae35c17a436dbebc6fc10c9f18d3.png

5、创建项目初始化时将产品信息存入缓存和布隆过滤器的操作

7c4d5290e5c54e57a81a9d943378a4cb.png

        关于实现的InitializingBean接口,在前面的章节也有说过,【问题篇】springboot项目通过数据库限制实例端口号_ 。

6、创建controller

6d3dece6305f4d448dcd2a1a4b8d9eff.png

        具体的处理流程就是前面贴的流程图的处理方式,最后一小节进行测试。


七、测试

        本次demo整合了swagger,所有直接通过swagger调用接口进行测试,前面有讲过如何整合swagger,【一】springboot整合swagger(超详细)_。 

1、测试数据库、缓存 、布隆过滤器中都存在的数据。

9745d914e67c4475a5662764d779d3eb.png

2adc6884f24f4c5cb268e135f4e66693.png布隆过滤器是二进制向量 

c4db6fdeb3ae4b61adbb03e7f1bf7d0a.png

9f11a4b136724bf4b1bea7a145d57e37.png

1bcbeb91738e4dadad373582e715c612.png可以看到走的是缓存。

2、测试数据库、缓存 、布隆过滤器中都不存在的数据。

c4f40b3ac844460b88d021d6069b47e9.png

控制台是空的,缓存和数据库都没走。 

3、测试布隆过滤器中存在的数据,数据库、缓存不存在的数据(模拟原本存在的数据,被删除了)

模拟操作:启动服务后,将id为1的产品从数据库和缓存中删除。

580180aefde4468c8f4e2c3d36dd4c18.png

681a08a400f8464a952cd537376003bb.png

会去缓存设置空值。

a4a6a3ecb02c4614b7733269f3ee935a.png

本次查询了数据库并缓存了一个null值。

0acd48134ac04a62876a28c95c1f30d5.png 当第二次请求时,查询id为1的产品时,如下:

d6cd3edcffc34518a22e429f62676da7.png

会去查询缓存,不会再次查询数据库了。

其他的情况本章就不再测试了,感兴趣的兄弟可以自己试试,到此null值设置法和布隆过滤器的解决办法都测试出效果了。

qq交流群导航——>231378628

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透 的相关文章

随机推荐

  • mongodb shell中显示更多数量的结果

    DBQuery shellBatchSize 300 url http stackoverflow com questions 3705517 how to print out more than 20 items documents in
  • AngularJs、RequireJs、AngularAMD、ui-router搭建的JS文件动态加载

    如今页面的复杂度极高 需要加载的脚本文件极多 降低了用户体验 所以写了这个动态加载脚本的demo 欢迎交流 1 主页 requireJs 入口 data main mian js 如下 b b
  • 递归和循环的区别

    针对需要重复地多次计算相同的问题 通常可以选择递归或者循环两种不同的方法 递归是在一个函数的内部调用这个函数本身 循环是通过设置计算的初始值及终止条件 在一个范围内重复计算 我们以计算1 2 3 n为例 我们可以采用递归和循环两种方式求出结
  • 三菱plc pwm指令_【三菱PLC指令教程】步进指令STL和RET(单序列状态转移图编程)

    戳上方 蓝字 PLC课程 关注我们哦 一 状态继电器 状态继电器 S 是PLC内部软继电器的一种 它和输入继电器 X 和输出继电器 Y 一样 有无数对常开触点和常闭触点 如不作步进状态软元件 可作一般的辅助继电器 M 使用 FX2N系列PL
  • CSS的盒模型

    盒子模型 Box Modle 可以用来对元素进行布局 包括内边距 边框 外边距 和实际内容这几个部分 盒子模型分为两种 第一种是W3C标准的盒子模型 标准盒模型 第二种IE标准的盒子模型 怪异盒模型 标准盒模型与怪异盒模型的表现效果的区别之
  • IPD流程介绍

    IPD体系中最重要的三大流程是市场管理流程 需求管理流程和集成产品开发流程 关系如图 图来自网上 尽量把三个流程的活动讲清楚 包括每个流程的活动的细节 运用的工具或方法等 1 MM流程 2 需求管理流程 3 集成产品开发流程
  • Oracle:错误码ORA-28040 的坑

    一 背景 因项目要求 第一次部署了Oracle 12 C的Server Linux CentOS版 数据库装好之后部署一个Java Web项目 A项目 去连接数据库 该Java项目之前用的Oracle是11 g版本 这次换成了12 C的版本
  • 使用docker方式安装FastDFS

    FastDFS 架构包括 Tracker server 和 Storage server 客户端请求 Tracker server 进行文件上传 下载 通过 Tracker server 调度 最终由 Storage server 完成文件
  • 时钟天气小插件显示没服务器,天气时钟小插件大全

    有没有好用的天气时钟插件 首先右击桌面选排列图标 勾选显示桌面图标 2 如果故障依旧 打开任务管理器 按下 Ctrl Alt Del 组合键即可打开 点击 文件 新建任务 在打开的 创建新任务 对话框中输入 explorer 单击 确定 按
  • windows docker wsl2的docker内存占用大

    windows docker wsl2的docker内存占用大 1重启wsl2 最终采用 实测直接stop运行的docker实例 并不会减少Vmmem内存 因此需要重启wsl2 输入wsl shutdown即可 同时把Docker Desk
  • Vs QT 程序添加按钮控件,及使用信号和槽

    include QtWidgetsApplication1 h include
  • 基于python的分布式实现多节点资产收集管理平台

    真正的大师 永远都怀着一颗学徒的心 一 项目简介 基于python的分布式实现多节点资产收集管理平台 二 实现功能 支持域名扫描 支持备案信息查询 支持fofa查询 支持多账号管理 支持web站点扫描 支持目录扫描 支持端口扫描 支持漏洞扫
  • ESP32 ADC –使用Arduino IDE读取模拟值

    本文介绍了如何使用Arduino IDE通过ESP32读取模拟输入 模拟读取对于从电位计或模拟传感器等可变电阻读取值非常有用 模拟输入 ADC ADC是非线性的 analogRead 函数 其他有用的功能 使用ESP32从电位计读取模拟值
  • MySQL 事务隔离级别,读现象,MVCC

    目录 数据库读现象 事务隔离级别 错误日志 详情参见 MySQL日志管理 JasonJi 博客园 mvcc多版本并发控制 多版本并发控制mvcc multi version concurrency controll 基于多版本的并发控制 在
  • 区块链应用开发入门

    区块链技术如今是非常火热 不仅让金融家和创投家趋之若鹜 如今已经在多个领域遍地播种 作为拥有锐利触角的创业家们 是否也想将区块链集成到你们现有的应用中去 而作为IT技术工程师的你 是否也是跃跃欲试 想基于区块链来练一下手 以免日后被新技术淘
  • tcpdump: syntax error 解决-linux 下安装tcpdump 和 libpcap

    关键 linux 如何下载包 wget 下载指定目录 linu 下载文件到指定目录 今天心血来潮突然想在自己的服务上抓某个端口 结果执行tcpdump时报错了 http www tcpdump org index html 找到Latest
  • 基于C语言的分页管理方式下存储分配情况模拟

    1 题目简介 借用外存空闲分区管理中位示图的方法来表示主存分配情况 实现主存空间的分配和回收 要求能显示和打印分配或回收前后的位示图和当前空闲块数 对完成一次分配后还要显示或打印为作业建立的页表 2 所用数据结构 为要分配的作业建立数据结构
  • 时钟抖动(Jitter)和时钟偏斜(Skew)

    在进行时序分析时 经常会遇到两个比较容易混淆的概念 那就是时钟抖动 Clock Jitter 和时钟偏斜 Clock Skew 下面就解释下两者的区别 一 Jitter 由于晶振本身稳定性 电源以及温度变化等原因造成了时钟频率的变化 指的是
  • ipc_perm 详解

    系统为每一个IPC对象保存一个ipc perm结构体 该结构说明了IPC对象的权限和所有者 每一个版本的内核各有不用的ipc perm结构成员 若要查看详细的定义请参阅文件
  • 【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透

    springboot篇章整体栏目 一 springboot整合swagger 超详细 二 springboot整合swagger 自定义 超详细 三 springboot整合token 超详细 四 springboot整合mybatis p