如何更新spring缓存partiallly(仅一个字段)?(当对象变异时)

时间:2016-03-06 11:36:22

标签: java spring caching

让我们假设我有一个方法可以为所有实体更新一个字段。

public void makeAllCarsRed(){...}

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

  1. @Cacheable - 尝试在缓存中查找值。如果找不到 - 执行方法并添加到缓存;
  2. @CachEvict - 只需按条件从缓存中删除对象;
  3. @CachPut - 将新值设置为缓存
  4. 我没有看到为我的情况应用这些注释的方法。

    P.S。

    我认为让所有cach无效是太昂贵了

1 个答案:

答案 0 :(得分:0)

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

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

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

你可以做的是将CacheManager注入拥有方法makeAllCarsRed()的类中,然后手动更新所有更新的entite:

在您的配置中

@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);
...
}
}