我正在尝试更新spring缓存中的值,但@CachePut不会替换实际值,而是使用相同的键放置另一个值:
Cachename:noTimeCache:
-
键:SYSTEM_STATUS,val:ON
-
键:SYSTEM_STATUS,val: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?
2 回答
1- @CachePut不会替换实际值,而是添加另一个值:delete key =“#setting.name”,这样keygenarator将使用GlobalSettings的哈希码(验证哈希码是否正确实现)并验证名称是否正确缓存“noTimeCache”未指定给其他方法 .
2 - 如果"setting"参数是GlobalSettings中的一个属性,请参阅此链接http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html您可以将SpEL表达式#settings.getSetting() . name()更改为#setting.setting.name
3 - 如果您使用的是Java 6,则可以执行以下操作(不知道是否可以使用java 7或8):
谢谢你的回答 . 它帮助我解决问题 .
@CachePut替换值,但键中存在问题 . 我使用这样的东西:
设置为枚举,默认密钥为枚举名称,例如SYSTEM_STATUS .
还有这个:
还会将密钥保存为STSYEM_STATUS .
密钥是相同的,但缓存解释这就像2个不同的缓存值,我不知道为什么 .
U不能像#setting那样在存储库类中使用变量名,它必须是#p0之类的参数索引,可能是因为spring数据使用了他自己的代理类 .
这解决了我所有的问题,现在缓存工作正常 .