使用@CacheEvict 多参数如何匹配删除

目录
  • @CacheEvict 多参数匹配删除
  • 解决思路
    • 方案一
    • 方案二

@CacheEvict 多参数匹配删除

如果@Cacheable(“XXX”)

Object getXXX(String a, String b, String c);

spring的缓存使用的key是ESPL表达式,然后翻看源码key默认用的生成方式是org.springframework.cache.interceptor.SimpleKeyGenerator

大于1个参数走的是最后一个方法

 /**
  * Generate a key based on the specified parameters.
  */
 public static Object generateKey(Object... params) {
  if (params.length == 0) {
   return SimpleKey.EMPTY;
  }
  if (params.length == 1) {
   Object param = params[0];
   if (param != null && !param.getClass().isArray()) {
    return param;
   }
  }
  return new SimpleKey(params);
 }

然后查看org.springframework.cache.interceptor.SimpleKey对应代码,发现返回的其实是SimpleKey

 /**
  * Create a new {@link SimpleKey} instance.
  * @param elements the elements of the key
  */
 public SimpleKey(Object... elements) {
  Assert.notNull(elements, "Elements must not be null");
  this.params = new Object[elements.length];
  System.arraycopy(elements, 0, this.params, 0, elements.length);
  this.hashCode = Arrays.deepHashCode(this.params);
 }

解决思路

方案一

单独写一个自定义的KeyGenerator,处理对应的key。(之前的redis的文章已写过,所以不重复写了)

下面博文的 MyKeyGenerator 这个类

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

方案二

@Cacheable(value=“XXX”, key=“xxxx”)
@CacheEvict(value=“XXX”, key=“xxxx”)

做相应的key配置

数组的话可以使用 key = “#root.args[0]”

参数参考如下:

名字 位置 描述 示例
methodName root object 当前被调用的方法名 #root.methodName
method root object 当前被调用的方法 #root.method .name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象类 #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表 #root.caches[0].name
argument name evaluation context 方法参数的名字,可以直接#参数名,也可以使用#p0或#a0的形式,0代表参数的索引 #iban、#a0、#p0
result evaluation context 方法执行后的返回值 #result

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

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

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

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

  • 详解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 多参数匹配删除 解决思路 方案一 方案二 @CacheEvict 多参数匹配删除 如果@Cacheable("XXX") Object getXXX(String a, String b, String c); spring的缓存使用的key是ESPL表达式,然后翻看源码key默认用的生成方式是org.springframework.cache.interceptor.SimpleKeyGenerator 大于1个参数走的是最后一个方法 /** * Gen

  • phpstorm 正则匹配删除空行、注释行(替换注释行为空行)

    使用phpstorm 来编写php 和javascript 代码,感觉还是不错的,用得也很舒服. 遇到了一个需求,有时候在阅读框架源代码的时候 , 想过滤(删除)掉源代码中的注释行,如果手动逐行删除显示不够科学. 当然想到了强大的正则匹配(regExp regular expression), 通过写一个正则表达式,来查找出所有的注释行,并将其替换成空,即实现了需求. 1. ctrl + F , 输入正则表达式:(//.*$)|(/*(.|s)*?*/) 2. ctrl + R, 不输入: 3.

  • MyBatis 多个条件使用Map传递参数进行批量删除方式

    目录 多个条件使用Map传递参数进行批量删除 1.使用场景 2.代码实现 3.实现结果展现 MyBatis 多条件批量删除的sql语句 我把这次的代码贴出来,仅供参考 多个条件使用Map传递参数进行批量删除 1.使用场景 因为项目需要针对资源文件(视频.音频.文档),编辑时候可能出现以下3种情况: 实现的项目效果图: 1.1.删除多个已经选择的标签(与本次文章相关内容) 1.2.新增标签(选择已有标签作为新增,输入新的标签作为新增的) 因为本业务场景之中与此文章相关的内容 重点介绍一下如何,使用

  • asp.net中mvc使用ajax提交参数的匹配问题解决探讨

    想到在asp.net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时,服务端总是会发生取不到值的情况,当然网上也有很多解决的例子,但都是在服务端想办法来解决的(比如将json转换为字符串,再在服务端反序列化为一个对象),为何不能在客户端就把这个问题搞定. 其实问题没那么复杂,那是因为在jquery提交Array的数据时,提交的时候始终会在名称后面加上"[]", 问题就出在这里.另外在服务端对数组和内嵌的js对象进行解析时,需要

  • Redis Cluster 字段模糊匹配及删除

    Questions 在数据库内我们可以通过like关键字.%.*或者REGEX关键字进行模糊匹配.而在Redis内我们如何进行模糊匹配呢?集群情况Redis Cluster的情况是否和单机一致呢?前段时间我对于这个议题进行了调查和研究. 单节点的情况 Jedis 参考stackoverflow上的解答,在Java内使用Jedis主要有如下2中写法: ### 方法1 Set<String> keys = jedis.keys(pattern); for (String key : keys) {

  • Tkinter canvas的画布参数,删除组件,添加垂直滚动条详解

    目录 1.画布 Canvas的参数 2.删除鼠标下的组件 3.带垂直滚动条的画布 总结 1.画布 Canvas的参数 from tkinter import * win = Tk() win.geometry('500x500+500+100') canvas = Canvas( master=win, # 父控件 bg='orange', # 背景颜色 bd=2, # 边框宽度 closeenough=1, # 当鼠标与画布上组件的距离小于该值时,认为鼠标在该组件上,是一个浮点型的值 curs

  • Springboot Cache @CacheEvict 无法模糊删除的解决方案

    目录 SpringbootCache @CacheEvict 无法模糊删除 以下代码适用于Redis @CacheEvict根据缓存名称模糊删除 看源码可知 SpringbootCache @CacheEvict 无法模糊删除 用@CacheEvict删除缓存只能删除指定key的缓存,有些情况需要根据前缀删除所有key的时候,用@CacheEvict就做不到了,所以我们自定义一个@CacheRemove来处理根据前缀模糊删除所有cache(支持Spring EL表达式) 以下代码适用于Redis

  • springboot使用redis对单个对象进行自动缓存更新删除的实现

    Springboot的项目搭建在此省略,pom文件依赖什么的就不说了 创建一个实体类 @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) @ApiModel(value="ERepository对象", description="题库") public class ERepository extends BasicModel<ERepository> implements

  • jQuery unbind 删除绑定事件详解

    unbind([type],[data]) 是 bind()的反向操作,从每一个匹配的元素中删除绑定的事件.如果没有参数,则删除所有绑定的事件.你可以将你用bind()注册的自定义事件取消绑定.如果提供了事件类型作为参数,则只删除该类型的绑定事件.如果把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除. 返回值 : jQuery 参数 : type (String) : (可选) 事件类型 data (Function) : (可选) 要从每个匹配元素的事件中反绑定的事

随机推荐