spring使用另一个签名从方法中逐出缓存

ryhaxcpt  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(352)

我在一个方法中缓存了一些查询

@Override
    @Cacheable(cacheNames = "user-actions")
    public UserAction getUserAction(UUID userId) {
        ...
    }

我想用另一种方法逐出缓存。例如,如果方法具有相同的签名,它就可以工作

@CacheEvict(cacheNames = "user-actions")
    public void evictUserLevel(UUID userId) {
        log.info("Cache user-actions has been evicted");
    }

但如果我不通过,有没有办法驱逐缓存 userId 要删除缓存的方法,或者它是否有多个参数?这不起作用:

@CacheEvict(cacheNames = "user-actions")
    public void processEvent(UserEvent event, UUID userId) {
        ...
    }
pprl5pva

pprl5pva1#

这对我有用

@CacheEvict(cacheNames = "user-events", key = "#root.args[1]")
    public void processEvent(UserEvent event, UUID userId) {
        ...
    }
``` `root.args` -表示方法参数和 `[1]` -是参数的索引
fhity93d

fhity93d2#

引用文件

默认密钥生成

因为缓存本质上是键值存储,所以缓存方法的每次调用都需要转换成一个适合缓存访问的键。开箱即用,缓存抽象使用一个简单的 KeyGenerator 基于以下算法:
如果没有给定参数,则返回0。
如果只给出一个参数,则返回该示例。
如果给定了多个参数,则返回从所有参数的哈希值计算出的键。
因此下面的签名不起作用,因为密钥是从 event 以及 userId .

@CacheEvict(cacheNames = "user-actions")
public void processEvent(UserEvent event, UUID userId) {
   ...
}

但,如果我不将userid传递给要逐出缓存的方法,或者如果它有多个参数,是否有方法逐出缓存?

对于无参数

allEntries=true ,将清除所有条目。

@CacheEvict(cacheNames = "user-actions", allEntries = true)
public void evictAll() {
}

对于多个参数

指定的参数 key ,详见自定义密钥生成声明。

@CacheEvict(cacheNames = "user-actions", key = "#userId")
public void processEvent(UserEvent event, UUID userId) {
...
}

相关问题