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
时,您仍在提供可能过时的值。如果需要一致性,就不能使用它
主要外卖:
如果不同时刷新,加载时间会增加应用程序的响应时间并恶化用户体验