码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透


       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布隆过滤器处理缓存穿透


    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。

    1. <dependency>
    2. <groupId>com.google.guavagroupId>
    3. <artifactId>guavaartifactId>
    4. dependency>

             或者使用redis提供的redisson。

    1. <dependency>
    2. <groupId>org.redissongroupId>
    3. <artifactId>redissonartifactId>
    4. 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

     

  • 相关阅读:
    时序分析 42 -- 时序数据转为空间数据 (一) 格拉姆角场
    图像智能处理黑科技,让图像处理信手拈来
    并发编程八 Collections之Map&List&Set
    水库大坝安全监测预警系统的重要作用
    Thread 类的基本用法
    中英文互译在线翻译
    人类小脑内在组织背后的基因图谱
    2023年中国大学生留学现状及未来发展规划分析:直接就业仍是毕业后的主流选择[图]
    Linux中的一些常用命令
    正点原子FreeRTOS(下)
  • 原文地址:https://blog.csdn.net/weixin_56995925/article/details/126208394
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号