【问题标题】:How does Guava expire entries in its CacheBuilder?Guava 如何过期其 CacheBuilder 中的条目?
【发布时间】:2012-04-26 00:23:17
【问题描述】:

我想使用这里推荐的 CacheBuilder:

Java time-based map/cache with expiring keys

但是我不明白 什么时候 Guava 知道条目会过期。

Guava 是如何做到这一点的,它会产生什么性能成本?

【问题讨论】:

    标签: java caching collections map guava


    【解决方案1】:

    Guava 团队成员在这里。

    Guava Cache 实现在正常维护操作过程中使条目过期,这在缓存写入操作期间以每个段为基础发生,偶尔在缓存读取操作期间发生。条目通常不会在其到期时间准确到期,只是因为Cache 故意决定不创建自己的维护线程,而是让用户决定是否需要持续维护。

    我将专注于expireAfterAccess,但expireAfterWrite 的过程几乎相同。在机制方面,当您在CacheBuilder 中指定expireAfterAccess 时,缓存的每个段都维护一个链表访问队列,用于条目按从最近最少访问到最近访问的顺序排列。缓存条目实际上本身就是链表中的节点,所以当一个条目被访问时,它会从访问队列中的旧位置移除自己,并将自己移动到队列的末尾。

    在执行缓存维护时,缓存所要做的就是使队列前面的每个条目都过期,直到找到未过期的条目。这很简单并且需要相对较少的开销,并且它发生在正常的缓存维护过程中。 (此外,缓存故意限制了单次清理中完成的工作量,从而最大限度地减少了任何单次缓存操作的费用。)通常,缓存维护的成本主要由计算缓存中的实际条目的费用决定。

    【讨论】:

    • +1... 非常感谢您的解释,也非常感谢 Guava。链表“绝招”非常巧妙!我正在安装 Guava:感谢您的详细回答,我现在在 Guava 上出售 :)
    • Charles Fry 在 Strange Loop 上就 MapMaker / CacheBuilder 做了精彩的介绍。讲座可用on InfoQ
    • 使用 LinkedList 以外的数据结构会以某种方式帮助改进驱逐过程吗?
    • 这很复杂,因为您需要实际指定替代方案。例如,仅交换 ArrayList 会损害性能:您在所描述的数据结构中所需的操作是从新近度列表中随机删除的,对于 ArrayList 来说是 O(n),而对于一个链表,因为您已经有一个指向该条目的指针。
    猜你喜欢
    • 2016-05-28
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多