Spring boot2.x配置redis缓存以及利用通配符删除缓存key

2023-11-13

环境:

  1. jdk1.8
  2. window系统
  3. 需要安装redis
  4. maven项目

一、依赖

redis跟缓存依赖是必须的

 <dependency>
        <!-- 缓存依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <!-- redis依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- msql依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据库相关依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- web项目依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

二、yml文件配置

这边贴出相关配置,空格啥的自己对对好

spring:
  redis:
    host: 127.0.0.1
    database: 0
    password:
    port: 6379
    jedis:
      pool:
        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms  # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10  # 连接池中的最大空闲连接
        min-idle: 5 # 连接池中的最小空闲连接
    timeout: 5000  # 连接超时时间(毫秒)
    ## Cache部分
  cache:
    cache-names: mysqls  #缓存的名称集合,多个采用逗号分割
    type: redis  #缓存的类型,官方提供了很多,这里我们填写redis
    redis:
      cache-null-values: false   #是否缓存null数据,默认是false
      time-to-live: 6000000   #redis中缓存超时的时间,默认60000ms
      # use-key-prefix: true   #缓存数据key是否使用前缀,默认是true
      # key-prefix: wz-  #缓存数据key的前缀,在上面的配置为true时有效

use-key-prefix这个属性不要,必须注释掉,false没有用,不然方法的Cacheable注解中value无效

三、开启缓存注解、缓存方法、以及缓存删除方法

启动类添加注解

@EnableCaching

缓存数据的方法添加注解

@Cacheable(value = "selectList",key = "#tableName+' '+#sqlLimit")
	public List selectList(String tableName, String sqlLimit) {
		return baseMapper.selectList(" * ",tableName," and "+sqlLimit);
	}

这里key策略我这使用全部参数(这个随意,根据项目来)
删除方法缓存注解

@Caching(evict={@CacheEvict(value = "selectString",key = "#tableName")
			,@CacheEvict(value = "selectOne",key = "#tableName")
			,@CacheEvict(value = "selectListJson",key = "#tableName")
			,@CacheEvict(value = "selectList",key = "#tableName")
			,@CacheEvict(value = "selectPageList",key = "#tableName")
	})
	public Integer delete(String tableName, String[] params) {
		return baseMapper.delete(tableName, params);
	}

我这配置了多个方法的删除(实际根据项目来)
在这里插入图片描述
我这缓存key是方法名称【CacheEvict的value值】+表名称+参数
上面部分都是常用的,百度都搜索的到。
到这里调用查询方法就能将查询数据缓存到redis中了。
但是CacheEvict删除缓存只能key-value删除,有时候业务需要根据某些属性删除多个key,比如表数据变更,需要删除表相关全部缓存key。
下面是重点
我这里需要删除表相关的缓存【不论查询参数缓存了多少个key】
原理很简单:利用spring aop切面对注解进行切片拓展,不会影响原来的注解方式等
利用spring aop切面后可以获取注解的CacheEvict的value值,key值等等,进行组装成通用key,然后用StringRedisTemplate类(RedisTemplate也可以)进行删除
直接上代码

@Component
@Aspect
public class Caching_expend {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    //这边是我自己封装的工具类,可以注入StringRedisTemplate实现,效果一样
    RedisUtils  RedisUtils;
    //截获标有@Caching的方法
    //我配置Caching,如果只有单个@CacheEvict这个,下面的类名称Caching改成CacheEvict即可【在同一个包】
    @Pointcut(value = "(execution(* *.*(..)) && @annotation(org.springframework.cache.annotation.Caching))")
    private void pointcut() {
    }
    /**
     * 功能描述: 切面在截获方法返回值之后
     *
     * @return void
     * @throws
     * @author wz
     * @date 2020/01/02 16:55
     * @params [joinPoint]
     */
    @AfterReturning(value = "pointcut()")
    private void process(JoinPoint joinPoint) {
        //获取被代理的类
        Object target = joinPoint.getTarget();
        //获取切入方法的数据
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //获取切入方法
        Method method = signature.getMethod();
        Object[] args=joinPoint.getArgs();
        //获得注解
       //单个@CacheEvict这个,下面的类名称Caching改成CacheEvict即可
        Caching Caching = method.getAnnotation(Caching.class);
        if (Caching != null) {
        	//单个@CacheEvict这个for循环就不需要了
            for(CacheEvict CacheEvict:Caching.evict()){
                String[] value = CacheEvict.value();
                String keys = CacheEvict.key();
                if (!"".equals(value)&&value.length>0) {
                	//这边可以根据自己需求进行自定义的删除
                    String key=value[0]+"::"+args[0].toString()+"*";
                    Set<String> deletekeys = RedisUtils.keys(key);
                    RedisUtils.delete(deletekeys);
                }

            }
        }
    }
}

上面定义后可以断点调试合适自己项目的模糊key。
测试类啥的自己写哦
本文不适合小白哦,如果帮助到你欢迎点个赞。
不明白底下留言。看到会回复

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

Spring boot2.x配置redis缓存以及利用通配符删除缓存key 的相关文章

随机推荐

  • Springboot框架整合Spring Data JPA操作数据

    一 Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架 JPA 规范的基础上封装的一套 JPA 应用框架 底层使用了 Hibernate 的 JPA 技术实现 可使开发者用极简的代码即可
  • 如何学习软件测试

    软件测试是确保软件质量的重要手段 在现代软件开发中 软件测试已经成为了必不可少的一环 因为它可以发现并纠正软件中的缺陷和错误 从而提高软件的可靠性 可用性和安全性 因此 学习软件测试对于想要从事或已经从事软件开发的人来说是非常重要的 以下是
  • springboot同时引入mysql5和mysql8,多数据源驱动解决方案

    springboot项目需要配置多数据源 同时引入mysql5和mysql8的时候 框架默认8版本的驱动 调用从库mysql5是会报驱动错误 CLIENT PLUGIN AUTH is required 解决办法 首先明确 mysql8配置
  • Qt_如何关联头文件、源文件和ui文件?

    1 头文件与源文件 首先头文件和源文件就不多说了 头文件放声明 源文件放定义 2 关于ui文件 我们知道在新建项目的时候 可以选择添加 ui和不添加两种 当添加上ui 文件的时候 我们可以利用designer来添加控件 直观上看到界面的布局
  • 一台windows环境下安装多个MySQL服务

    将第一个安装的MySQL安装文件夹复制一份并重命名 修改my ini的配置文件内容 把第二个MySQL服务配置环境变量 D Program Files MySQL MySQL3307 Server 5 5 bin 添加到系统变量path中
  • gitee的详细使用教程

    文章目录 前言 一 将本地文件上传至gitee仓库中 1 创建本地文件夹 2 将本地文件初始化为本地仓库 3 上传至本地仓库中 1 将文件从工作区存入暂缓区 2 将暂缓区的文件存入本地仓库中 4 还原已删除文件 5 将本地仓库文件上传至gi
  • Android(安卓)上传文件到阿里云点播,阿里云点播转码

    Android 安卓 上传文件到阿里云点播 阿里云点播转码 文章目录 Android 安卓 上传文件到阿里云点播 阿里云点播转码 一 登录阿里云点播平台配置添加转码模板组 1 需要什么参数 可自行填写 然后保存 如图 2 把获取的模板 ID
  • 解决安装mysql与mariadb冲突问题(卸载干净mariadb)

    阿里云服务器 centos7 6 a 查询mariadb libs的包名 rpm qa grep mariadb b 卸载 rpm e mariadb libs 5 5 60 1 el7 5 x86 64 error Failed depe
  • 基于线程池模型的讨论与完整代码演示

    线程池引入的必要性 在网络服务器中 包括大量的web服务器 它们都需要在单位时间内必须处理相当数目的接入请求以及数据处理 通常在传统多线程服务器中是这样实现的 一旦有个请求到达 就创建一个线程 由该线程执行任务 任务执行完毕后 线程就退出
  • 连接MySQL错误create connection SQLException, url jdbcmysqllocalhost3306

    具体报错如下 2018 11 12 16 14 21 704 ERROR 9752 eate 1537371824 com alibaba druid pool DruidDataSource create connection SQLEx
  • 鉴权认证的基本概念

    最近项目中用到 学习了一下 记录下来后续有时间再继续研究 单点登录 单点登录SSO Single Sign On 简单点就是在一个多系统共存的环境下 用户在一处登录后 就不用在其他系统中登录 也就是用户的一次登录能得到其他所有系统的信任 单
  • 这是一篇关于如何成为一名AI算法工程师的长文

    点击上方 Datawhale 选择 星标 公众号 第一时间获取价值内容 这是一篇关于如何成为一名AI算法工程师的长文 经常有朋友私信问 如何学python呀 如何敲代码呀 如何进入AI行业呀 正好回头看看自己这一年走过的路 进行一次经验总结
  • Arduino离线安装Esp8266

    首先安装ArduinoIDE 可以直接去github官网下载 链接 安装完成后 打开Arduino IDE 文件 gt 首选项 在 其他开发板管理器网址 输入框中 填入以下网址 https www arduino me package es
  • mysql下载与安装

    1 网址 http www mysql com 2 进入网址 选择DOWNLOADS 下载 3 选择社区版 4 进入之后选择如下都可以 5 下载64位的 点进来都是最新的版本 点击如下可选择下载之前的版本 6 安装
  • 模型的过拟合与欠拟合

    过拟合与欠拟合 定义 过拟合 High Viarance 欠拟合 High Bias 误差 Error 产生原因 解决方案 防止欠拟合 防止过拟合 正则化 L0范数 L1范数 L2范数 讨论 参考 定义 首先要确定的两个概念是Underfi
  • gtk主题指南

    一 gtk主题指南 1 Widgets 2 Styles 3 Engines 4 gtkrc文件 1 修改构件的属性 2 每一构件的分为五种状态 3 风格绑定 1 将一种风格绑定到组件类 2 组件嵌套的方式widget class 如wid
  • 尚硅谷-谷粒商城P44Vue模板

    配置模板
  • 11个代码质量审核和管理工具,程序员必备!

    点击上方 全栈开发者社区 右上角 设为星标 如今 代码质量分析和审核已成为每个企业的基本流程 随着开源代码库使用的增加 安全性和代码质量对于构建高质量软件至关重要 不良的代码不仅会影响代码的可维护性 而且还会在某些情况下影响其性能 此外 更
  • TensorRT基础

    目录 1 1 TensorRT构建和编译一个模型 1 2 Interference 1 3 动态shape 1 4 ONNX TensorRT的核心在于对模型算子的优化 合并算子 利用GPU特性选择特定核函数等多种策略 通过tensorRT
  • Spring boot2.x配置redis缓存以及利用通配符删除缓存key

    环境 jdk1 8 window系统 需要安装redis maven项目 一 依赖 redis跟缓存依赖是必须的