在采用数组或集合参数的方法上使用Spring缓存有哪些策略?
我想使用Spring的缓存抽象将方法注释为@Cacheable。但是,有些方法设计用于获取数组或参数集合并返回集合。例如,考虑这种方法来发现实体:在采用数组或集合参数的方法上使用Spring缓存有哪些策略?,spring,caching,spring-cache,Spring,Caching,Spring Cache,我想使用Spring的缓存抽象将方法注释为@Cacheable。但是,有些方法设计用于获取数组或参数集合并返回集合。例如,考虑这种方法来发现实体: public Collection<Entity> getEntities(Collection<Long> ids) 公共集合getEntities(集合ID) 从语义上讲,我需要单独缓存实体对象(由id设置键),而不是基于整个id集合。与询问的内容类似 通过its支持我想要的东西,但我想使用Spring的抽象来支持缓存
public Collection<Entity> getEntities(Collection<Long> ids)
公共集合getEntities(集合ID)
从语义上讲,我需要单独缓存实体
对象(由id设置键),而不是基于整个id集合。与询问的内容类似
通过its支持我想要的东西,但我想使用Spring的抽象来支持缓存存储实现的简单更改(Guava、Coherence、Hazelcast等),而不仅仅是memcached
使用Spring Cache缓存这种方法有哪些策略?不支持这种开箱即用的行为。然而,这并不意味着这是不可能的;只是需要做更多的工作来支持所需的行为
我写了一篇小文章,演示开发人员如何实现这一点。该示例使用Spring来演示定制。此示例需要根据您所需的缓存提供程序(例如Hazelcast、Coherence等)进行调整
简而言之,您需要重写实现的方法来“装饰”应用程序。这因实施而异。在ConcurrentMapCacheManager
中,方法为。在SpringDataGemFire中,您将重写该方法以修饰返回的缓存。对于番石榴,它将是GuavaCacheManager
中的
然后,您的(可能/理想情况下,委托给实际的from)将处理缓存键和相应值的集合
这种方法几乎没有局限性:
干杯 为我工作。这是我答案的链接。 TL:DR
@Cacheable(cacheNames=“test”,key=“#p0”)
公共列表getTestFunction(列出SomeId){
我的例子是String,但它也适用于Integer和Long,可能还有其他。我还应该指出,如果您提前知道您不打算切换缓存提供程序,那么您可以根据提供程序实现
Cache
操作。例如,如果Memcached使用ReadThr处理此问题如果使用MultiCache,那么您可以在ReadThroughMultiCache中实现Cache.get(key)操作(可能还有put?)根据您的描述,缓存提供商是不可知的。John,我感谢您的努力和想法,但限制#1对我来说是一个破坏者。我们需要智能缓存,以便密钥列表中的项不会是“全部或全部”我们需要随时使用列表中的缓存项。是的,不幸的是,在我脑海中,除了(在一定程度上)束缚自己之外,我想不出更好的方法来让它更智能在您的基础缓存提供程序上。无论如何,该框架是灵活的,因为它为您提供了一个扩展选项,以自定义行为。但是,开箱即用,这将很难支持,特别是在缓存提供程序之间的一致性。欢迎对此类问题的建议或其他想法。@JohnBlum非常有用
@Cacheable(cacheNames = "test", key = "#p0")
public List<String> getTestFunction(List<String> someIds) {