Java 番石榴加载缓存-保鲜至到期

Java 番石榴加载缓存-保鲜至到期,java,caching,guava,Java,Caching,Guava,我有一个在Guava中加载缓存的特定用例 使30m内未访问的密钥过期 只要缓存中有一个密钥,无论访问如何,都要保持其新鲜 我只能通过使用一些外部的混乱来理解这些语义。 张贴在这里,看看人们是否可以提供更好的想法 问题 refreshAfterWrite()仅在访问时触发 cache.refresh()->CacheLoader.reload() 即使返回oldValue,也会更新访问/写入的计时器 返回immediateCancelledFuture()会导致不良日志记录 基本上,reloa

我有一个在Guava中加载缓存的特定用例

  • 使30m内未访问的密钥过期
  • 只要缓存中有一个密钥,无论访问如何,都要保持其新鲜
  • 我只能通过使用一些外部的混乱来理解这些语义。

    张贴在这里,看看人们是否可以提供更好的想法

    问题

  • refreshAfterWrite()仅在访问时触发
  • cache.refresh()->CacheLoader.reload()
    • 即使返回oldValue,也会更新访问/写入的计时器
    • 返回immediateCancelledFuture()会导致不良日志记录
    • 基本上,reload()不能说什么都没有改变
  • 解决方案

  • 在缓存上设置expireAfterAccess
  • 使用外部执行器服务为每个密钥安排刷新作业
  • refreshJob.run()检查缓存是否仍有密钥
    • (asMap().containsKey())不更新访问时间
  • 查询上游,并且仅当存在更改的值时才执行cache.put()
  • 差不多了

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