java - guava LoadingCache.refresh - 如果我们可以只使用 Cache.invalidate,为什么还需要它?
问题描述
使用番石榴——我们为什么需要LoadingCache.refresh
?我们不能只使用Cache.invalidate
并且在我们的下一个get
值会被刷新吗?
解决方案
语义是:
LoadingCache.refresh
: 现有映射仍然存在,缓存继续返回存储的值,直到新值可用Cache.invalidate
: 映射被丢弃。下一次加载新值LoadingCache.get()
如果您的应用程序使用LoadingCache.get()
两者之间可能没有“逻辑”差异。如果(可能有很多)并发请求发生,那么应用程序的行为会有所不同:
- 随着
LoadingCache.refresh
应用程序将不断地服务请求。加载程序响应时间不影响应用程序响应时间。 - 使用
LoadingCache.get()
,请求可能会阻塞,直到加载完成。这可能会变得很危险,例如,假设每秒有 1000 个请求,而您的加载需要 5 秒。这意味着 5000 个请求将被阻止并等待响应。如果一个应用程序请求依赖于多个缓存和加载器,这可能会更糟。 - 但是,
LoadingCache.refresh
您仍然在提供可能已过时的价值。如果需要一致性,则不能使用它
主要外卖:
如果不同时刷新,加载时间会增加您的应用程序响应时间并恶化用户体验。
推荐阅读
- javascript - GraphQL:在文件上传期间解决承诺时出错
- c# - 覆盖/更新文件夹中的现有图像文件
- javascript - 如何在mysql数据库中插入我的代码JS
- java - 为什么当 tabAt[i] 不为空时 ConcurrentHashMap 不使用“CAS”但使用“同步”
- java - Firebase UI RecyclerView
- c++ - 将 Doctest 与代码一起使用时将实现放在哪里
- robotframework - 使用 Robot Framework 的执行级别设置和拆卸
- angular - 如何重置电话号码。使用库 NgxIntlTelInput 的字段?
- angular - 基本身份验证标头未在 Angular GET 请求上发送
- git - “git svn init”挂起并且没有创建有效的回购