【发布时间】: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