我有一个在 Guava 中使用 LoadingCache 的特定用例。
- 30m内未访问的过期key
- 只要密钥在缓存中,无论访问如何,都保持最新
我只能通过使用一些外部组件来获得这些语义。 https://gist.github.com/kashyapp/5309855
在这里发帖看看人们是否可以提供更好的想法。
问题
- refreshAfterWrite() 仅在访问时触发
- cache.refresh() -> CacheLoader.reload()
- 即使我们返回 oldValue 也会更新访问/写入的计时器
- 返回 immediateCancelledFuture() 会导致丑陋的日志记录
- reload() 基本上没有办法说没有任何改变
解决方案
- 在缓存上设置 expireAfterAccess
- 使用外部执行器服务为每个键安排一个 refreshJob
- refreshJob.run() 检查缓存是否还有密钥
- (asMap().containsKey()) 不更新访问时间
- 查询上游,并且只有在值发生变化时才执行 cache.put()
差不多好了
但这并不是我打算做的,虽然足够接近。如果上游没有改变,那么未访问的密钥就会过期。上游更改的键不会在缓存中过期。