【问题标题】:Google MapMaker: iterating over entries in LRU orderGoogle MapMaker:按 LRU 顺序迭代条目
【发布时间】:2012-09-26 16:42:10
【问题描述】:

是否可以按 LRU 顺序迭代 MapMaker 创建的地图? com.googlecode.concurrentlinkedhashmap 具有 ascendingKeySetdescendingKeySet 方法,但在 MapMakerCustomConcurrentHashMap 的一个实例)返回的映射中似乎没有这些方法。默认迭代器是否使用 LRU 排序?粗略看一下代码表明不是。

我正在尝试为包含 MapMaker 地图的类实现克隆方法,因此我需要一种方法来创建地图的克隆,同时维护地图条目的 LRU 顺序。

除了同步问题之外,如果我可以按 LRU 顺序迭代条目,那么我可以将条目添加到具有相同限制的 MapMaker 地图的新实例中,并且我将获得一个可行的克隆。

【问题讨论】:

    标签: java map guava


    【解决方案1】:

    不,这是不可能的。 MapMaker 不会在任何地方保留全局 LRU 排序;这些段保持内部 LRU 顺序,仅此而已。

    【讨论】:

    • 在 Cache 接口中我们最初包含 ImmutableMap activeEntries(int threshold) 来支持获取最热的条目。活动的概念并不意味着它是明确的顺序,只是顶部的块。通过使用上限,它可以在组合分段块时返回更少。此方法已被删除,因为该功能尚未出现在 CCHM 中,但可以重新引入。支持 CLHM 背后的原因是允许 Cassandra 重新启动到热缓存并最大程度地减少现有代码库的迁移痛苦(例如,集成到 JCS 中)。
    • 似乎在序列化/反序列化之间没有维护条目的 LRU 顺序。我无法对此进行测试,因为 LRU 排序未公开,但查看 SerializationProxy 的实现,它只是遍历 entrySet() 返回的映射以将映射键和值写入磁盘。这意味着反序列化的映射将开始以看似任意的顺序驱逐条目。我在这里遗漏了什么,还是您认为保留反序列化地图的 LRU 顺序并不重要?
    • 我认为我们认为保留反序列化映射的 LRU 顺序并不重要。规范中唯一隐含 LRU 排序的地方是 expireAfterAccess,但我认为在反序列化时重置过期时间是完全合理的设计调用。
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-05-18
    相关资源
    最近更新 更多