@CacheEvict 清除多个key的实现方式

借用@Caching实现

入参是基本类型的:

@Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId"),
      @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleId"),
      @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")})
public ResponseData remove(@RequestParam Long roleId) {
………………
}

入参是对象的:

@Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleDto.roleId"),
      @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleDto.roleId"),
      @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleDto.roleId")})
  public ResponseData edit(RoleDto roleDto) {
    this.roleService.editRole(roleDto);
    return SUCCESS_TIP;
  }

补充:@CacheEvict 模糊删除缓存问题-RedisTemplate 模糊key删除缓存

缓存管理使用注解形式,非常方便了我们的使用,然而今天我想 使用 @CacheEvict 的实和key 进行 模糊删除,发现 @CacheEvict 貌似不支持这样的操作,然后想起 RedisTemplate 好像支持 key的模糊匹配。

于是,方法有了

既然@CacheEvict做不到,那就用 RedisTemplate

第一步:

获取key

这里的key就是 :  user:role* 这样的

Set<Object,Object> keys = redisTemplate.keys( key );

第二步:

判断 keys 非空,然后进行删除

if (CollectionUtils.isNotEmpty(keys)) {
     redisTemplate.delete(keys);
}

总结:

删除缓存的时候,如果 keys 是空的,则没有反应,因为查看源码可知,redisTemplate 帮你判断了,如果是 空的则 return

此处也有可能删不掉,删不掉很可能就是 key 的序列化问题

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Java 使用keytool创建CA证书的操作

    keytool是一个密钥和证书管理工具 1.keytool工具位置 keytool工具在 JDK 的安装目录的 bin 目录下面 2.keytool工具命令展示 打开命令行进入 bin 目录,然后输入命令 keytool.exe,就能看见keytool工具支持哪些命令,如下图所示: 注意下面的用法提示:使用 "keytool -command_name -help" 获取 command_name 的用法 3.查看具体命令用法 这里我们使用 -genkeypair 命令来创建密钥库,先

  • spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springfra

  • Java使用RedisTemplate模糊删除key操作

    Redis模糊匹配批量删除操作,使用RedisTemplate操作: public void deleteByPrex(String prex) { Set<String> keys = redisTemplate.keys(prex); if (CollectionUtils.isNotEmpty(keys)) { redisTemplate.delete(keys); } } prex为迷糊匹配的key,如cache:user:* 这里需要判断keys是否存在,如果一个都匹配不到会报错:

  • Java中HashMap里面key为null存放到哪

    我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢? 在put方法里头,其实第一行就处理了key=null的情况. // HashMap的put方法 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) // key为null调用putForNull

  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如: @Cacheable(value="mycache") @Cacheable(value={"cache1","cache2"} key 缓存的 key,可以为空,如果指定要按照

  • @CacheEvict 清除多个key的实现方式

    借用@Caching实现 入参是基本类型的: @Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleId"), @C

  • 使用@CacheEvict清除指定下所有缓存

    目录 @CacheEvict清除指定下所有缓存 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @CacheEvict清除指定下所有缓存 @CacheEvict(cacheNames = "parts:grid",allEntries = true) 此注解会清除part:grid下所有缓存 @CacheEvict要求指定一个或多个缓存,使之都受影响.

  • @CacheEvict + redis实现批量删除缓存

    目录 @CacheEvict + redis批量删除缓存 一.@Cacheable注解 二.@CacheEvict注解 三.批量删除缓存 四.代码 @CacheEvict清除指定下所有缓存 @CacheEvict + redis批量删除缓存 一.@Cacheable注解 添加缓存. /** * @Cacheable * 将方法的运行结果进行缓存:以后再要相同的数据,直接从缓存中获取,不用调用方法: * CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每

  • Spring @Cacheable读取配置常量方式

    目录 Spring @Cacheable读取配置常量 属性①:value 属性②:key Spring缓存管理(Cacheable) 基于注解的支持 @Cacheable @CachePut @CacheEvict Spring @Cacheable读取配置常量 属性①:value String REDIS_DATABASE="database"; cacheable的name.默认会在后面加上双冒号,手动调用加上:: 属性②:key String REDIS_KEY_PREFIX=&

  • vue 界面刷新数据被清除 localStorage的使用详解

    localStorage是html5新增的一个本地存储API,它有5M的大小空间,通过(key,value)的方式存储在浏览器中 window.localStorage.setItem('key', value); //储存文件 window.localStorage.getItem('key'); //读取文件 window.localStorage.removeItem('key'); //清除文件 vue中使用方法: 1.新建一个store.js文件 localStorage只能存储字符串

  • sprintboot使用spring-security包,缓存内存与redis共存方式

    目录 项目修改需求描述 代码 使用到的依赖包 代码处理 异常问题解决 项目修改需求描述 项目需要使用分布式缓存机制,但是使用@Cacheable原始仅配置了内存版的,故此次需要改成redis用以支持多应用模式的. 项目中如果直接改成redis的,存在一个问题.如果内存对象同一类,比如都是String的list对象,存的key值又都是"code",会把缓存给冲掉,所以需要对redis的做后缀处理.又因为只有一个redis服务器,所以需要对缓存做项目的前缀处理. 还希望能支持历史项目,做到

  • Spring @Cacheable注解中key的使用详解

    目录 Spring @Cacheable注解中key使用 下面是几个使用参数作为key的示例 condition属性指定发生的条件 @CachePut @CacheEvict allEntries属性 beforeInvocation属性 @Caching 使用自定义注解 @Cacheable 拼接key Spring @Cacheable注解中key使用 key属性是用来指定Spring缓存方法的返回结果时对应的key的.该属性支持SpringEL表达式.当我们没有指定该属性时,Spring将

  • @CacheEvict中的allEntries与beforeInvocation的区别说明

    目录 @CacheEvict allEntries与beforeInvocation区别 @CacheEvict注解参数详解 1.value 2. allEntries 3.beforeInvocation 4.condition 5.key 6.cacheNames @CacheEvict allEntries与beforeInvocation区别 在spring cache中,@CacheEvict是清除缓存的注解. 其中注解参数可以只有value,key意思是清除在value值空间中的ke

  • 详细解读分布式锁原理及三种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项."所以,很多系统在设计之初就要对这三者做出取舍.在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证"最终一致性",只要这个最终

随机推荐