Java guava LoadingCache.refresh-如果我们可以缓存.invalidate,为什么我们需要它?

Java guava LoadingCache.refresh-如果我们可以缓存.invalidate,为什么我们需要它?,java,caching,guava,Java,Caching,Guava,使用番石榴-为什么我们需要加载缓存。刷新? 我们不能只使用缓存。无效然后在下一次获取时刷新值吗?语义如下: LoadingCache.refresh:现有映射仍然存在,缓存将继续返回存储的值,直到新值可用 Cache.invalidate:已放弃映射。新值将在下一次加载cache.get()时加载。 如果应用程序使用LoadingCache.get(),则两者之间可能没有“逻辑”上的差异。如果发生(可能大量)并发请求,则应用程序的行为将不同: 使用LoadingCache.refresh应

使用番石榴-为什么我们需要
加载缓存。刷新
?
我们不能只使用
缓存。无效
然后在下一次
获取
时刷新值吗?

语义如下:

  • LoadingCache.refresh
    :现有映射仍然存在,缓存将继续返回存储的值,直到新值可用
  • Cache.invalidate
    :已放弃映射。新值将在下一次加载cache.get()时加载。
如果应用程序使用
LoadingCache.get()
,则两者之间可能没有“逻辑”上的差异。如果发生(可能大量)并发请求,则应用程序的行为将不同:

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

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