番石榴装载缓存 - 保持新鲜直至到期

时间:2013-04-04 12:30:23

标签: java caching guava

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

  1. 使30米内未访问的密钥失效
  2. 只要密钥在缓存中,无论访问权限如何都保持新鲜
  3. 我只能通过使用一些外部kludge来达到这些语义。 https://gist.github.com/kashyapp/5309855

    在这里发帖,看看有没有人可以提出更好的想法。

    问题

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

      1. 在缓存上设置expireAfterAccess
      2. 使用外部执行程序服务为每个密钥安排refreshJob
      3. refreshJob.run()检查缓存是否仍具有密钥
        • (asMap()。containsKey())不会更新访问时间
      4. 查询上游,并仅在存在更改值时执行cache.put()
      5. 差不多

        但这并不是我打算做的,尽管足够接近。如果上游未更改,则未访问的密钥将过期。上游变更的密钥不会在缓存中过期。

0 个答案:

没有答案