番石榴 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
,您仍在提供可能已过时的值。如果你需要一致性,你不能使用它
主要收获:
如果不同时刷新,加载时间会增加您的应用程序响应时间并恶化用户体验。
使用 guava - 为什么我们需要 LoadingCache.refresh
?
我们不能只使用 Cache.invalidate
并在下一个 get
上刷新该值吗?
语义是:
LoadingCache.refresh
: 现有映射仍然存在,缓存继续return存储的值,直到新值可用Cache.invalidate
:映射被丢弃。将在下一个LoadingCache.get()
时加载新值
如果您的应用程序使用 LoadingCache.get()
,则两者之间可能没有“逻辑”差异。如果(可能有很多)并发请求发生,那么应用程序的行为会有所不同:
- 使用
LoadingCache.refresh
应用程序将不断地为请求提供服务。加载程序响应时间不影响应用程序响应时间。 - 使用
LoadingCache.get()
,请求可能会阻塞,直到加载完成。这可能会很危险,例如,假设每秒有 1000 个请求,而您的加载需要 5 秒。这意味着将阻止 5000 个请求并等待响应。如果一个应用程序请求依赖于多个缓存和加载器,情况可能会更糟。 - 但是,对于
LoadingCache.refresh
,您仍在提供可能已过时的值。如果你需要一致性,你不能使用它
主要收获:
如果不同时刷新,加载时间会增加您的应用程序响应时间并恶化用户体验。