java—如何从不同的方法将相同的实体放入ehcache中

7uzetpgm  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(288)

我有三种方法:
@可缓存getcompany(long id);
@可缓存getcompany(字符串代码);
@可缓存getcompanies();
它们使用的是来自ehcache的同一个缓存,当我调用first getcompanies()时(所有公司都加载到缓存中),下一次我调用getcompany by id时,这个方法不是从缓存返回company对象,而是直接从db返回company对象(也把对象放到缓存中,但是使用不同的键-所以我们现在在一个缓存中有两个相同的对象)。如何实现自定义密钥生成器以强制所有方法从缓存中放入/读取?

zlwx9yxi

zlwx9yxi1#

超载 getCompany() :
缓存是按键查找。因为有两个方法具有不同的键类型,所以缓存没有其他键类型的Map。您可以使用双缓存,即使用两个键将每个公司放入缓存两次。Spring提供了更普遍的 @Caching 更复杂规则的注解:

@Caching(cacheable = @Cacheable(key = "#code"), put = {@CachePut(key = "#result.id"), @CachePut(key = "#result.code")})
getCompany(String code) {
}

@Caching(cacheable = @Cacheable(key = "#id"), put = {@CachePut(key = "#result.id"), @CachePut(key = "#result.code")})
getCompany(Long id) {
}
``` `getCompanies()` :
这个list all-kind方法没有参数,因此总是使用一个通用键来访问缓存。结果的类型也与其他方法不同,因此缓存没有机会决定第一次返回什么。
它将始终返回相同的公司从第二次访问!
即使您以某种方式强制执行缓存以返回所有缓存的公司,它通常也不会满足您的要求,因为缓存会随着时间的推移而发生变化(ttl等),即使没有更改备份系统中的公司(例如数据库)。
如果您真的想使用它,并且您可以控制备份系统中唯一的代码操作,请看 `@CacheEvict` 确保在更换公司时清理缓存。

相关问题