首页 > 解决方案 > guava LoadingCache.refresh - 如果我们可以只使用 Cache.invalidate,为什么还需要它?

问题描述

使用番石榴——我们为什么需要LoadingCache.refresh?我们不能只使用Cache.invalidate并且在我们的下一个get值会被刷新吗?

标签: javacachingguava

解决方案


语义是:

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

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

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

主要外卖:

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


推荐阅读