java - 如何部分更新spring缓存(仅一个字段)?(当对象发生变化时)

标签 java spring caching

假设我有一种方法可以更新所有实体的一个字段。

public void makeAllCarsRed(){...}

我知道Spring提供了3个注解来管理缓存:

  1. @Cacheable - 尝试在缓存中查找值。如果找不到 - 执行方法并添加到缓存;
  2. @CachEvict - 只需按条件从缓存中删除对象;
  3. @CachPut - 将新值放入缓存

我没有找到适合我的情况应用这些注释的方法。

附注

我认为使所有缓存无效的成本太高

最佳答案

Spring 缓存整个实体,而不是单个字段。因此您无法从缓存中逐出字段。

如果您想从缓存中逐出实体,也会遇到问题,但这是可以解决的:

在您的方法之外,它是不可见的,哪些实体会更新,因此您不能使用任何这些注释。

您可以做的是将 CacheManager 注入(inject)到拥有方法 makeAllCarsRed() 的类中,然后为所有更新的实体手动更新缓存:

在你的配置中

@Bean
public CacheManager cacheManager() {
    return new ConcurrentMapCacheManager("cacheName");
}

具有 makeAllCarsRed() 的类:

public class MakeAllCarsRedService{
@Autowired CacheManager cm;
...
public void makeAllCarsRed(){
Cache cache = cm.getCache("cacheName");
//remove from cache
cache.evict(key)
//or, if neddec add to cache
put(key, entity);
...
}
}

关于java - 如何部分更新spring缓存(仅一个字段)?(当对象发生变化时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35826385/

相关文章:

java - 带生存时间的 EHcache 简单示例

ruby-on-rails - 区域设置更改时如何使片段缓存过期?

java - Java SSLSocket 和 HTML5 之间的通信

java - 如何从给定字符串获取描述中的预期输出

java - Mysql Java 更新查询

java - 如何为黑莓手机制作注销菜单按钮

java - 如何在 REST Spring 中正确处理具有相互对象引用的请求主体?

java - Spring Controller 400错误请求和application/x-www-form-urlencov/s application/json

java - Apache CXF FaultListener 未在 cxf 总线中注册

java - 如何使用 Spark 将对象永久保存在内存中?