番石榴 LoadingCache.refresh - 如果我们可以 Cache.invalidate 为什么我们需要它?

guava LoadingCache.refresh - why do we need it if we can just Cache.invalidate?

使用 guava - 为什么我们需要 LoadingCache.refresh? 我们不能只使用 Cache.invalidate 并在下一个 get 上刷新该值吗?

语义是:

  • LoadingCache.refresh: 现有映射仍然存在,缓存继续return存储的值,直到新值可用
  • Cache.invalidate:映射被丢弃。将在下一个 LoadingCache.get()
  • 时加载新值

如果您的应用程序使用 LoadingCache.get(),则两者之间可能没有“逻辑”差异。如果(可能有很多)并发请求发生,那么应用程序的行为会有所不同:

  • 使用 LoadingCache.refresh 应用程序将不断地为请求提供服务。加载程序响应时间不影响应用程序响应时间。
  • 使用 LoadingCache.get(),请求可能会阻塞,直到加载完成。这可能会很危险,例如,假设每秒有 1000 个请求,而您的加载需要 5 秒。这意味着将阻止 5000 个请求并等待响应。如果一个应用程序请求依赖于多个缓存和加载器,情况可能会更糟。
  • 但是,对于 LoadingCache.refresh,您仍在提供可能已过时的值。如果你需要一致性,你不能使用它

主要收获:

如果不同时刷新,加载时间会增加您的应用程序响应时间并恶化用户体验。