如何通过不同的方法将相同的实体放入 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<> 中?

如何将同一个xib文件绑定到不同的核心数据实体

当实体在不同的项目中时,为啥 Mediator 不解析方法?

对来自 jar 的实体应用 ehCache

Spring整合Ehcache管理缓存