2

我有一个在 Guava 中使用 LoadingCache 的特定用例。

  1. 30m内未访问的过期key
  2. 只要密钥在缓存中,无论访问如何,都保持最新

我只能通过使用一些外部组件来获得这些语义。 https://gist.github.com/kashyapp/5309855

在这里发帖看看人们是否可以提供更好的想法。

问题

  1. refreshAfterWrite() 仅在访问时触发
  2. cache.refresh() -> CacheLoader.reload()
    • 即使我们返回 oldValue 也会更新访问/写入的计时器
    • 返回 immediateCancelledFuture() 会导致丑陋的日志记录
    • reload() 基本上没有办法说没有任何改变

解决方案

  1. 在缓存上设置 expireAfterAccess
  2. 使用外部执行器服务为每个键安排一个 refreshJob
  3. refreshJob.run() 检查缓存是否还有密钥
    • (asMap().containsKey()) 不更新访问时间
  4. 查询上游,并且只有在值发生变化时才执行 cache.put()

差不多好了

但这并不是我打算做的,虽然足够接近。如果上游没有改变,那么未访问的密钥就会过期。上游更改的键不会在缓存中过期。

4

0 回答 0