gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:25:51 27 4
gpt4 key购买 nike

我想使用 Spring 的 Cache 抽象将方法注释为 @Cacheable。但是,有些方法被设计为采用一个数组或参数集合并返回一个集合。例如,考虑这种方法来查找实体:

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

语义上,我需要缓存 Entity单独的对象(由 id 键入),而不是基于整个 ID 的集合。类似于 this question正在询问。

Simple Spring Memcached支持我想要的,通过它的 ReadThroughMultiCache ,但我想使用 Spring 的抽象来支持缓存存储实现(Guava、Coherence、Hazelcast 等)的轻松更改,而不仅仅是 memcached。

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

最佳答案

Spring's Cache Abstraction不支持这种开箱即用的行为。但是,这并不意味着不可能;支持所需的行为只是多一点工作。

我写了一个小example演示开发人员如何实现这一点。该示例使用 Spring 的 ConcurrentMapCacheManager演示自定义。此示例需要适应您所需的缓存提供程序(例如 Hazelcast、Coherence 等)。

简而言之,您需要覆盖 CacheManager “装饰” Cache 的实现方法.这因实现而异。在 ConcurrentMapCacheManager ,方法为createConcurrentMapCache(name:String) .在 Spring Data GemFire 中,您将覆盖 getCache(name:String)方法来装饰返回的 Cache。对于 Guava ,它将是 createGuavaCache(name:String)GuavaCacheManager , 等等。

然后你的custom, decorated Cache implementation (也许/理想情况下,从 Cache impl 委托(delegate)给实际的 this )将处理缓存键和相应值的集合。

这种方法有一些限制:

  • 缓存未命中是全部或全部;即,如果缺少任何单个键,则缓存的部分键将被视为未命中。 Spring (OOTB) 不允许您同时返回缓存值并调用 diff 的方法。这将需要对我不推荐的缓存抽象进行一些非常广泛的修改。
  • 我的实现只是一个例子,所以我选择不实现 Cache.putIfAbsent(key, value)操作(here)。
  • 虽然我的实现有效,但它可以变得更加健壮。

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

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

    干杯!

    关于spring - 在采用数组或集合参数的方法上使用 Spring Cache 存在哪些策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33657881/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com