【问题标题】:Spring "cacheNames" doesn't work with "key"Spring“cacheNames”不适用于“key”
【发布时间】:2019-03-24 10:10:42
【问题描述】:

我正在尝试为我的方法配置缓存,如下所示:

@Cacheable(value = USER_ENTITY_1_CACHE, key = "#userId")
public List<MyEntity1> findEntities1(Long userId) {
//...
}

还有:

@Cacheable(value = USER_ENTITY_2_CACHE, key = "#userId")
public Set<MyEntity2> findEntities2(Long userId) 
{
    //..
}

@Cacheable(value = USER_ENTITY_2_CACHE, key = "#userId")
public Set<MyEntity2> findEntities2(Long userId, boolean deleted) 
{
    //..
}

并为此驱逐:

@CacheEvict(cacheNames = USER_ENTITY_2_CACHE, key = "#userId", condition = "#userId != null")

不幸的是,当我使用相同的 userId 调用此方法中的任何一个时,第二个方法的结果会从第一个方法中缓存。这会导致铸造问题和混乱。

例如,

java.util.LinkedHashSet cannot be cast to java.util.List

换句话说,当我调用 findEntities1 然后 findEntities2 时,findEntities2 没有被调用,而是从缓存中取出并因类转换异常而失败。如果我以相反的顺序调用它们,同样的工作。 我真正想要的是这两个缓存 USER_ENTITY_1_CACHE、USER_ENTITY_2_CACHE 彼此不了解,并存储自己的方法调用。

我正在使用 RedisCacheManager。

你有什么想法吗?

【问题讨论】:

  • 不定义key,去掉key试试

标签: java spring spring-boot caching redis


【解决方案1】:

删除显式定义的键并尝试

Key 会根据参数自动生成。

@Cacheable(value = USER_ENTITY_1_CACHE)
public List<MyEntity1> findEntities1(Long userId) {
//...
}
And:

@Cacheable(value = USER_ENTITY_2_CACHE)
public Set<MyEntity2> findEntities2(Long userId) 
{
    //..
}

【讨论】:

  • 就我而言,它不起作用。我还有一种这样的方法:@Cacheable(value = USER_ENTITY_2_CACHE, key = "#userId") public Set findEntities2(Long userId, boolean deleted) { //.. } 我用 @CacheEvict(cacheNames = USER_ENTITY_2_CACHE,键 = "#userId",条件 = "#userId != null")。如果我不使用密钥,恐怕 evict 将无法按预期工作
  • 从 evict 中删除密钥,只要 evict 操作有 userId 作为参数,它肯定会起作用
  • 不会删除所有用户的缓存吗?
  • 否,除非您提供了所有条目。
  • 我想我很困惑,我什么时候应该指定“key”,如果不是这样的话?为什么从技术上讲它不适用于我的情况?
猜你喜欢
  • 1970-01-01
  • 2011-08-07
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2014-09-01
  • 1970-01-01
相关资源
最近更新 更多