
public Collection<Entity> getEntities(Collection<Long> ids)
从语义上讲,我需要单独缓存Entity对象(由id键控),而不是基于整个ID集合.与this question所询问的相似.
Simple Spring Memcached支持我想要的东西,通过它的ReadThroughMultiCache,但我想使用Spring的抽象来支持轻松更改缓存存储实现(Guava,Coherence,Hazelcast等),而不仅仅是memcached.
使用Spring Cache缓存这种方法有哪些策略?
我写了一篇小型的example,展示了开发人员如何实现这一目标.该示例使用Spring的ConcurrentMapCacheManager来演示自定义.此示例需要适应您所需的缓存提供程序(例如Hazelcast,Coherence等).
简而言之,您需要覆盖CacheManager实现的“装饰”Cache的方法.这从实现到实现各不相同.在ConcurrentMapCacheManager中,方法是createConcurrentMapCache(name:String).在Spring Data GemFire中,您将覆盖getCache(name:String)方法以装饰返回的Cache.对于Guava,它将是GuavaCacheManager中的createGuavaCache(name:String),依此类推.
然后你的custom, decorated Cache implementation(可能/理想情况下,从this委托给实际的Cache impl)将处理缓存密钥和相应值的集合.
这种方法的局限性很少:
>缓存未命中全部或全部;即,如果缺少任何单个密钥,则缓存的部分密钥将被视为未命中. Spring(OOTB)不允许您同时返回缓存值并调用diff的方法.这需要对Cache Abstraction进行一些非常广泛的修改,我不建议这样做.
>我的实现只是一个例子,所以我选择不实现Cache.putIfAbsent(key, value)操作(here).
>虽然我的实施工作正常,但它可以变得更加健壮.
无论如何,我希望它提供了一些如何正确处理这种情况的见解.
测试类是自包含的(使用Spring JavaConfig),并且可以在没有任何额外依赖性的情况下运行(超出Spring,JUnit和JRE).
干杯!
转载注明原文:在采用数组或集合参数的方法上使用Spring Cache有哪些策略? - 乐贴网