Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在采用数组或集合参数的方法上使用Spring缓存有哪些策略?_Spring_Caching_Spring Cache - Fatal编程技术网

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

在采用数组或集合参数的方法上使用Spring缓存有哪些策略?,spring,caching,spring-cache,Spring,Caching,Spring Cache,我想使用Spring的缓存抽象将方法注释为@Cacheable。但是,有些方法设计用于获取数组或参数集合并返回集合。例如,考虑这种方法来发现实体: public Collection<Entity> getEntities(Collection<Long> ids) 公共集合getEntities(集合ID) 从语义上讲,我需要单独缓存实体对象(由id设置键),而不是基于整个id集合。与询问的内容类似 通过its支持我想要的东西,但我想使用Spring的抽象来支持缓存

我想使用Spring的缓存抽象将方法注释为@Cacheable。但是,有些方法设计用于获取数组或参数集合并返回集合。例如,考虑这种方法来发现实体:

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)将处理缓存键和相应值的集合

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

  • 缓存未命中是全部或全部;i、 e.如果缺少任何单个密钥,缓存的部分密钥将被视为未命中。Spring(OOTB)不允许您同时返回缓存值并调用diff的方法。这需要对缓存抽象进行一些非常广泛的修改,我不推荐这样做

  • 我的实现只是一个示例,因此我选择不实现操作()

  • 虽然我的实现可以工作,但它可以变得更加健壮

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

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


    干杯

    为我工作。这是我答案的链接。

    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) {