gpt4 book ai didi

Spring Boot @CachePut,它是如何工作的

转载 作者:行者123 更新时间:2023-12-05 05:22:59 25 4
gpt4 key购买 nike

我正在尝试更新 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接口(interface)方法的方式,比如save()给它们加上注解@Cacheable?

最佳答案

1-@CachePut 不替换实际值,而是放置另一个值 :delete key = "#setting.name"这样 keygenarator 将使用 GlobalSettings 的哈希码(验证哈希码是否正确实现)并验证是否缓存名称“noTimeCache”未指定给其他方法。

2-查看此链接 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html如果“设置”参数是 GlobalSettings 中的一个属性,您可以将 SpEL 表达式 #setting.getSetting().name() 更改为 #setting.setting.name

3-如果您使用的是 java 6,则可以执行以下操作(不知道 java 7 或 8 是否可行):

public interface GlobalSettingsRepository extends JpaRepository<GlobalSettings, Long>{

@Override
@CacheEvict(value = {"noTimeCache"}, allEntries = true)
GlobalSettings save(GlobalSettings globalSettings);
}

关于Spring Boot @CachePut,它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com