当前位置: 首页 > 面试题库 >

带有项目/实体集合的Spring Cache

舒博雅
2023-03-14
问题内容

我正在使用Spring Cache,在这里传递一组键,返回的是实体列表。我想让缓存框架了解返回列表中的每个元素都将与相应的代码一起缓存。目前看来,键是整个列表,如果我在随后的调用中缺少键,它将尝试重新加载整个集合。

@Override
@Cacheable(value = "countries")
public List<Country> getAll(List<String>codes) {
    return countryDao.findAllInCodes(codes);
}

另一个可能性是返回的是地图,类似地,我希望缓存足够智能,以仅查询以前从未查询过的项目,还可以使用键将每个项目缓存。

@Override
@Cacheable(value = "countries")
public Map<String,Country> getAllByCode(List<String>codes) {
    return countryDao.findAllInCodes(codes);
}

假设国家/地区类别如下所示:

class Country{
  String code; 
  String fullName;
  long id;

... // getters setters constructurs etc.. 
}

Spring Cache有可能吗?


问题答案:

实际上,即使使用Spring的Caching Abstraction,也有可能,但不是现成的(OOTB)。本质上,你必须自定义Spring的缓存基础结构(下面进一步解释)

通过默认情况下,Spring的缓存架构采用全@Cacheable方法参数的参数作为缓存的“钥匙”,作为解释在这里。当然,你也可以自定义使用一个关键分辨率规划环境地政司表达或用自定义KeyGenerator实现,如解释在这里。

尽管如此,这并不会将参数参数的集合或数组以及@Cacheable方法的返回值分解为单独的缓存项(即,基于数组/集合或Map的键/值对)。

为此,你需要一个Spring的 自定义实现CacheManager(取决于你的缓存策略/提供者)和Cache接口。

注意:具有讽刺意味的是,这将是我第三次回答几乎相同的问题,第一次在这里,然后在这里,现在在这里,:-)。无论如何…

我已经对此示例进行了更新/整理(有点)。

请注意,我的例子扩展和定制的ConcurrentMapCacheManager所提供的Spring框架本身。

从理论上说,你可以扩展/自定义任何CacheManager的实现,像Redis的公司在springRedis的数据,这里(源),或枢纽的GemFire的 CacheManager在spring数据的GemFire,这里(源)。的开源版本匹的GemFire是阿帕奇的Geode,其具有相应的弹簧数据的Geode项目,(来源的CacheManager在spring数据的Geode,这基本上等同于SD的GemFire)。当然,你可以将此技术应用于其他缓存提供程序… Hazelcast,Ehcache等。

但是,工作的真正实质是由Spring的Cache接口的自定义实现(或更具体地说,是基类)处理的 。

无论如何,希望从我的示例中,你将能够弄清楚在应用程序中需要做什么才能满足应用程序的缓存要求。



 类似资料:
  • 我正在使用Spring Cache,其中我传入一个键集合,返回是一个实体列表。我想让缓存框架明白返回列表中的每个元素都将使用相应的代码进行缓存。目前,键似乎是整个列表,如果我在后续调用中缺少一个键,它将再次尝试重新加载整个集合。 另一种可能性是返回是一个映射,同样,我希望缓存足够智能,可以只查询以前从未查询过的项目,也可以用它的键缓存每个项目。 假设乡村类如下所示: 这在Spring Cache中

  • 我想在 WPF 中创建一个顶部有一个项的组合框,当它被选中时,选定项应设置为 null(重置为默认状态)。我一直在寻找,但没有找到令人满意的解决方案。 如果可能的话,我希望它只使用XAML代码或附加的行为来实现,因为我不太喜欢更改视图的ViewModel中的内容,或者重写标准控件。 这是我到目前为止想出的(缩短代码): 我认为最好的方法是以某种方式添加一个事件触发器,当项目被选中时,该触发器将设置

  • 我的问题很简单,但找到解决办法却成了一项相当乏味和困难的任务。 我有两个冬眠实体, (或“父”实体)有三个字段, (实体的集合-关系)。 当从的集合中删除时(从对象的集合中删除和通过Dog存储库从数据库中删除),以及更新所有者的地址,然后尝试将更新后的对象保存到数据库中,将引发以下异常: 解决这个问题的一种方法是,在更新集合后,通过使用调用所有者的,获取的新版本,然后更新所有者的地址并将实体保存到

  • 我通常使用JPQL查询数据库,但今天我不得不使用原生查询,因为性能原因和JPQL中没有的特性(联接子查询)。使用JPQL,可以使用join fetch来检索父实体及其子实体集合。然而,当我尝试使用本机查询时,对于每个父实体,将返回多行,每行包含父实体及其子实体之一的数据。然后返回的列表包含父级的重复对象。假设一个父级有两个子级,那么下面的查询将在列表中返回2个父级,而不是1个。 任何人都知道如何避

  • 我试图使用项目外部定义的类型orm实体。也就是说,我有两个项目:模型和核心api。Models是导出实体定义的npm包。因此,从核心api(nestjs项目)开始,我尝试使用这些实体定义连接。大概是这样的: 然后,在一个模块中,我从npm包导入A实体: 这将导致下一个错误: 我完全不知道如何跟随,因为我不明白它在引擎盖下是如何工作的。我看到了typeorm和@nestjs/typeorm的代码,但