我在Guava中有一个带有LoadingCache的特定用例。
- 使30米内未访问的密钥失效
- 只要密钥在缓存中,无论访问权限如何都保持新鲜
醇>
我只能通过使用一些外部kludge来达到这些语义。
https://gist.github.com/kashyapp/5309855
在这里发帖,看看有没有人可以提出更好的想法。
问题
- refreshAfterWrite()仅在访问时触发
- cache.refresh() - > CacheLoader.reload()
- 即使我们返回oldValue
,也会更新访问/写入的计时器
- 返回immediateCancelledFuture()会导致难看的日志记录
- 基本上没有办法让reload()说没有改变
醇>
解决方案
- 在缓存上设置expireAfterAccess
- 使用外部执行程序服务为每个密钥安排refreshJob
- refreshJob.run()检查缓存是否仍具有密钥
- (asMap()。containsKey())不会更新访问时间
- 查询上游,并仅在存在更改值时执行cache.put()
醇>
差不多
但这并不是我打算做的,尽管足够接近。如果上游未更改,则未访问的密钥将过期。上游变更的密钥不会在缓存中过期。