当前位置: 首页 > 知识库问答 >
问题:

在采用数组或集合参数的方法上使用Spring缓存有哪些策略?

干永丰
2023-03-14

我想使用Spring的缓存抽象将方法注释为@Cacheable。然而,一些方法被设计为获取参数的数组或集合并返回集合。例如,考虑使用此方法查找实体:

public Collection<Entity> getEntities(Collection<Long> ids)

从语义上讲,我需要单独缓存实体对象(由id设置密钥),而不是基于整个id集合。类似于这个问题的问题。

Simple Spring Memcached通过其读通多缓存支持我想要的东西,但我想使用Spring的抽象来支持缓存存储实现的简单更改(Guava、Coherence、Hazelcast等),而不仅仅是Memcached。

使用Spring Cache缓存这种方法有哪些策略?

共有2个答案

杜俊爽
2023-03-14

为我工作。这是我答案的链接。https://stackoverflow.com/a/60992530/2891027

TL:DR

@Cacheable(cacheNames = "test", key = "#p0")
public List<String> getTestFunction(List<String> someIds) {

我的例子是字符串,但它也适用于整数和长,可能还有其他。

景元徽
2023-03-14

Spring的缓存抽象不支持这种开箱即用的行为。然而,这并不意味着这是不可能的;只是需要做更多的工作来支持所需的行为。

我写了一个小例子来演示开发人员如何实现这一点。该示例使用Spring的ConcurrentMapCacheManager演示定制。此示例需要根据您想要的缓存提供程序(例如Hazelcast、Coherence等)进行调整。

简而言之,您需要重写CacheManager实现“装饰”缓存的方法。这因实施情况而异。在ConcurrentMapCacheManager中,方法是createConcurrentMapCache(名称:String)。在Spring Data GemFire中,您将重写getCache(名称:String)方法来修饰返回的缓存。对于番石榴,它将是GuavaCacheManager中的createGuavaCache(名称:String),以此类推。

然后,您自定义的、经过修饰的Cache实现(可能/理想情况下,从这里委托给实际的Cache impl)将处理缓存键和相应值的集合。

这种方法几乎没有局限性:

>

我的实现只是一个例子,所以我选择不实现缓存。putIfAbsent(键、值)操作(此处)。

虽然我的实现可行,但它可以变得更加健壮。

无论如何,我希望它能提供一些关于如何正确处理这种情况的见解。

测试类是自包含的(使用Spring JavaConfig),可以在没有任何额外依赖的情况下运行(除了Spring、JUnit和JRE之外)。

干杯!

 类似资料:
  • 本文向大家介绍iOS 缓存存储方式有哪些策略?相关面试题,主要包含被问及iOS 缓存存储方式有哪些策略?时的应答技巧和注意事项,需要的朋友参考一下 你可以设置缓存的数据需要保存多长时间,ASIHTTPRequest提供了两种策略: a,ASICacheForSessionDurationCacheStoragePolicy,默认策略,基于session的缓存数据存储。当下次运行或[ASIHTTPR

  • 考虑下面的类。 基于这个结果,我认为java中的< code>main方法没有参数。如果我错了,请纠正我。如果它需要一些输入参数,为什么我会得到这个输出?

  • 本文向大家介绍BN的参数有哪些?相关面试题,主要包含被问及BN的参数有哪些?时的应答技巧和注意事项,需要的朋友参考一下  

  • 本文向大家介绍addEventListener的参数有哪些?相关面试题,主要包含被问及addEventListener的参数有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: addEventListener(event, function, useCapture) 其中,event指定事件名;function指定要事件触发时执行的函数;useCapture指定事件是否在捕获或冒泡阶段

  • 本文向大家介绍Spring与Mybatis的整合方法有哪些,包括了Spring与Mybatis的整合方法有哪些的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接 http://code.google.com/p/mybatis/下载到。   1、采用数据映射器(MapperFactor

  • 问题内容: 假设您有: 现在显然声明一是执行此操作的正确方法,并且在声明二上收到编译错误。我想知道为什么Java选择以这种特定方式强制执行类型安全。如果“猫”列表仍然是“动物”列表,那么为什么期望有动物列表的方法却拒绝接收一堆猫呢? 好奇心比什么都重要-并有机会更好地完善我的知识。 干杯,戴夫。 问题答案: Java泛型不是 协变的 。如果可以这样做: 那么您将能够执行以下操作: 这违反了只能容纳