如何解决Spring共享@Cachable和@CachePut键
我正在尝试将Spring缓存集成到我的项目中。我已经设置了Redis缓存管理器,它确实可以工作。但是,这是我的情况:我有一个Setting
实体。我想制作一个findAll
方法来返回所有设置,并创建一个setSetting
来设置特定的设置。
这是我为getSettings
和setSetting
定义的代码:
@Cacheable(value = "setting")
public List<Setting> getSettings() {
return repository.findAll();
}
@CachePut("setting")
public Optional<Setting> setSetting(String key,Object value) {
var setting = this.repository.findByIdentifier(key);
if (setting.isEmpty()) {
return Optional.empty();
}
try {
setting.get().setValue(mapper.writeValueAsString(value));
} catch (JsonProcessingException e) {
LOG.error("Could not serialize the value: {}",value);
return Optional.empty();
}
this.repository.save(setting.get());
return setting;
}
当我致电getSettings
时,我在Redis中得到了一个setting::SimpleKey []
键(这是我的预期行为)。但是,当我调用setSetting
时,由于存在额外的参数,所以没有覆盖setting::SimpleKey []
键,而是在Redis中使用了另一个键:"setting::SimpleKey [name,foobar]" (where name and foobar are the arguments I've sent to
setSetting`)。
我知道kecusyGenerator
的工作方式,但是这似乎很出乎意料,我也不太了解如何设置findAll
中使用的原始密钥。我是否必须制作自定义密钥生成器?
我会寻求任何帮助!
解决方法
为了使setSetting
覆盖从getSettings
返回的缓存值,两种方法都应返回List<Setting>
。您确实需要在每次更新设置之前清除现有的缓存值,例如
@Cacheable(value = "setting")
public List<Setting> getSettings() {
return repository.findAll();
}
@CacheEvict(value = "setting",allEntries = true,beforeInvocation = true)
@Cacheable(value = "setting",key = "T(org.springframework.cache.interceptor.SimpleKey).EMPTY")
public List<Setting> setSetting(String key,Object value) {
// 1. update the setting value (as already done in your code) and save changes
...
this.repository.save(setting.get());
// 2. Return the list of settings
return repository.findAll();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。