【发布时间】:2016-12-29 00:16:17
【问题描述】:
我正在尝试更新 spring 缓存中的值,但是 @CachePut 不会替换实际值,而是使用相同的键放置另一个值:
缓存名称:noTimeCache:
- 键:SYSTEM_STATUS,值:ON
- 键:SYSTEM_STATUS,值:OFF
1.为什么?
我的缓存服务:
@CachePut(value = "noTimeCache", key = "#setting.getSetting().name()")
public String updateGlobalCacheValue(GlobalSettings setting) {
System.out.println("Setting: " + setting.getSetting().name() + ", val: " + setting.getValue());
return setting.getValue();
}
我知道这看起来很有趣,但我需要使用 jpa 存储库。也许有人有更好的解决方案。
2.为什么我不能像这样使用函数参数作为@Cacheable 键?
@Cacheable(value = "noTimeCache", key = "#setting.name()", unless = "#result == null")
@Query("SELECT gs.value FROM GlobalSettings gs WHERE gs.setting = ?1")
String getGlobalSettingValue(Settings setting);
它告诉我设置为空。
3.是否有覆盖@Repositository接口方法的方式,比如save()给它们添加注解@Cacheable?
【问题讨论】:
-
也许愚蠢的问题:你使用什么样的缓存(管理器)允许重复键?如果我没记错的话,默认的只是
ConcurrentHashMap。如果你选择其他的,比如 ehCache 或 Redis,如果你将它设置为一个已经存在的键,它们也会覆盖现有的值。
标签: spring spring-boot spring-data-jpa spring-cache