【问题标题】:Java cache Set of requested elementsJava 缓存 请求的元素集
【发布时间】:2022-01-16 18:45:55
【问题描述】:

我面临以下问题,我想知道其他人的意见和建议。

我有一个带有以下查询参数的第三方 API: 假设有 10000 个 storeId,调用该 API 将导致 10k 次调用

?storeId=1&status=active

我有自己的服务,它使用从我自己的端点请求的 N 个 storeId 调用此 API。假设我调用我的服务,例如 100 家商店

http://localhost:8080?storeIds=[1,2,3,4,5...] 最多 100

此调用也可能是来自过滤商店的请求:

http://localhost:8080?storeIds=[78,99,104,320,123...] 最多 N

List<Store> stores = new ArrayList<>(storeIds.size());
storeIds.forEach(storeId -> {
   Store store = thirdPartyService.call(storeId);
   stores.add(store);
});

进行并行调用会导致第三方系统崩溃,因为它无法支持 x 秒那么多的请求。

我无法更改第三方端点以接受 N 个 storeIds

为了解决这个问题,我仍然实现了一个缓存,因为我在我的缓存中存储每个存储 1 一个 1 它也会导致性能问题,因为如果你必须调用缓存 10.000 次。

由于我从我的端点收到的 storeIds 列表并不总是相同的,它可以包含一些在缓存中的 storeIds 而其他一些不是我无法从缓存中检索所有的,所以我必须调用将它们发送到第三方 api。

我想知道是否有另一种观点来解决这个问题,因为将一组 storeIds 存储为缓存并不能解决问题,例如:

第一次调用:storeIds:[1,2,3,4,5,732,2321](我们这里有更多,但我简化了这个)storedSet on cache 第二次调用:[1,2,3,99,102,232,732](我们还有更多)

在第二次调用中,有些元素在缓存中,有些没有,甚至有些没有被请求。先前存储在缓存上的 Set 包含其中一些数据,但也包含一些我不需要的数据,这就是为什么我将数据存储为 1 storeId = 1 缓存上的条目。

非常感谢!

【问题讨论】:

  • 我不清楚你在问什么。缓存的键应该是 storeId,因此在上面的示例中,您向第三方服务发出的满足第二次调用的请求将要求 99、102 和 232,并返回 1、2、3 和 732 的缓存版本。
  • 大多数 Java 缓存实现,如 Caffeine、cache2k、EHCache 或与 JCache 兼容的缓存都有一个名为 Cache.getAll 的批量获取方法。这将满足您的要求。返回缓存中已经存在的条目,并通过配置的CacheLoader 为丢失的条目发出加载请求。

标签: java performance caching


【解决方案1】:

许多缓存实现都提供所谓的批量获取方法:Cache.getAll。这就是你想要的伎俩。这是基于cache2k 的解决方案草图。缓存设置为:

    Cache<Integer, Store> cache =
      new Cache2kBuilder<Integer, Store>() {}
      .loader(id -> {
        // http call to get Store data for given id
        return new Store();
      })
      .loaderThreadCount(4) // numbers of parallel loads
      .build();

然后你可以像这样检索数据:

    // request some data, everything will be retrieved via the loader
    Map<Integer, Store> result = cache.getAll(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
    // ids 4 and 5 will be taken from the cache, the others are loaded
    Map<Integer, Store> result2 = cache.getAll(Arrays.asList(4, 5,10, 12, 17));

这将向您的数据源发出最多 4 个并行加载请求。异步变体也可用。

该解决方案与其他缓存类似,例如 Caffeine、EHCache 或任何与 JCache 兼容的缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多