相关疑难解决方法(0)

Spring cache/jsr107:列表/集合参数作为键的一部分

我有一个服务,它调用外部系统通过外部 ID 检索某种对象并将它们提交回更新。有一种更通用的方法,而不是一个接一个地检索对象:

public interface ExternalSystem {
    List<ExternalDTO> getObjects(List<String> externalIds);

    void updateObjects(List<ExternalDTO> updates);
}
Run Code Online (Sandbox Code Playgroud)

我想在外部系统调用之上放置一个缓存,因为它们非常昂贵。

在服务的实现中我可以简单地添加spring注释:

@Cacheable("cache-external")
List<ExternalDTO> getObjects(List<String> externalIds) {} 

@CacheEvict(cacheNames="cache-external", allEntries=true)
void updateObjects(List<ExternalDTO> updates);
Run Code Online (Sandbox Code Playgroud)

但是,如果 externalId 之间有很多交集,这样的缓存会表现得非常糟糕,即

  1. Call#1 getObjects([1,2,3,4]) -> 通过 [1,2,3,4] 键缓存
  2. Call#2 getObjects([1,2,3,4,5]) -> 通过 [1,2,3,4,5] 键缓存
  3. Call#3 getObjects([6,7,8,9]) -> 通过 [6,7,8,9] 键缓存
  4. Call#4 updateObjects( 1 ) -> 逐出所有缓存,但第三个缓存不包含 3

所以,问题是如何实现自定义策略(我认为它不能开箱即用),该策略将仅逐出那些真正应该逐出的条目,并使键以从缓存中检索相交对象的方式?

更新。我发现了两个类似的问题:

  1. spring-cache-abstraction-with-multi-value-queries 弹簧缓存抽象与多值查询
  2. 使用 spring-cache-on-methods-take-array-or-collection
  3. spring-cacheable-methods-with-lists 弹簧可缓存方法与列表

更新2。 这与我想要的类似,只是我将为集合中的每个项目放入 String 和ExternalDTO 的缓存对。 列表到列表的元素级缓存

java spring caching jcache jsr107

6
推荐指数
1
解决办法
9562
查看次数

标签 统计

caching ×1

java ×1

jcache ×1

jsr107 ×1

spring ×1