使用@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

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: