如何通过不同的方法将相同的实体放入 EhCache
Posted
技术标签:
【中文标题】如何通过不同的方法将相同的实体放入 EhCache【英文标题】:How to put same entities in EhCache from different methods 【发布时间】:2021-02-27 16:10:38 【问题描述】:我有三种方法:
@Cacheable getCompany(Long id);
@Cacheable getCompany(字符串代码);
@Cacheable getCompanies();
他们使用来自 EhCache 的相同缓存,当我首先调用 getCompanies()(所有公司都加载到缓存中)然后我通过 id 调用 getCompany 时,此方法不是从缓存返回公司对象,而是直接从数据库返回(并且还将对象放入缓存,但使用不同的键 - 所以我们现在在一个缓存中有两个相同的对象)。 如何实现自定义密钥生成器以强制所有方法从缓存中放入/读取?
【问题讨论】:
【参考方案1】:重载getCompany()
:
缓存是按键查找。由于您有两种具有不同键类型的方法,因此缓存没有其他类型键的映射。您可以使用双重缓存,也就是使用两个键将每个公司两次放入缓存中。 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()
:
此列表所有类型的方法没有参数,因此始终使用通用键来访问缓存。结果也是与其他方法不同的类型,因此缓存没有机会确定第一次返回什么。
从第二次调用开始,它总是会返回相同的公司!
即使您以某种方式强制缓存以返回所有缓存的公司,它通常也不会是您想要的,因为缓存会随着时间的推移发生变化(TTL 等),即使不更改支持系统(例如数据库)中的公司.
如果您真的想使用它并且您可以控制支持系统的唯一代码操作,请查看@CacheEvict
以确保在更换公司时清理缓存。
【讨论】:
以上是关于如何通过不同的方法将相同的实体放入 EhCache的主要内容,如果未能解决你的问题,请参考以下文章
将7个不同的小球放入4个不同盒子中,每个盒子都不空,则不同的方法中种数有
创建缓存时如何将所有缓存名称及其数据放入 List<> 中?