如何解决Spring从具有另一个签名的方法中驱逐缓存
@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) {
...
}
解决方法
这对我有用
@CacheEvict(cacheNames = "user-events",key = "#root.args[1]")
public void processEvent(UserEvent event,UUID userId) {
...
}
root.args
- 表示方法参数,[1]
- 是参数的索引
引用自 documentation
默认密钥生成
由于缓存本质上是键值存储,因此缓存方法的每次调用都需要转换为适合缓存访问的键。开箱即用,缓存抽象使用基于以下算法的简单 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
的参数,详情参考Custom Key Generation Declaration。
@CacheEvict(cacheNames = "user-actions",key = "#userId")
public void processEvent(UserEvent event,UUID userId) {
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。