微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring从具有另一个签名的方法中驱逐缓存

如何解决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。

  • 如果只给出一个参数,则返回该实例。

  • 如果给出了更多的一个参数,则返回根据所有参数的哈希计算得出的键。


因此下面的签名不起作用,因为密钥是从 eventuserId 计算出来的。

@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 举报,一经查实,本站将立刻删除。