【发布时间】:2011-01-19 10:13:19
【问题描述】:
哪些 Guava 类适合线程安全缓存?我使用了一个组合键,它是动态构建的,所以 softKeys() 没有意义,对吧?我在某处看到了 ConcurentLinkedHashMap,这是要走的路吗?它已经在最近的版本中了吗?抱歉问的方式很混乱……
更新
这个问题已经很老了,浏览他的答案可能会浪费时间。很久以来就有一个CacheBuilder 这是要走的路。
【问题讨论】:
哪些 Guava 类适合线程安全缓存?我使用了一个组合键,它是动态构建的,所以 softKeys() 没有意义,对吧?我在某处看到了 ConcurentLinkedHashMap,这是要走的路吗?它已经在最近的版本中了吗?抱歉问的方式很混乱……
这个问题已经很老了,浏览他的答案可能会浪费时间。很久以来就有一个CacheBuilder 这是要走的路。
【问题讨论】:
10.0 版的新 Guava 库引入了专为缓存而设计的Cache 接口。
自带CacheBuilder,与MapMaker类似,MapMaker的所有缓存方法将在release 11中移除。
文档中的示例:
Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
【讨论】:
听起来你想要@987654321@,但你提到softKeys,所以我假设你已经熟悉那个类。
softKeys 是正确的 - 如果您即时组合键,它将不起作用,因为 softKeys 导致映射使用 == 而不是 equals 进行键比较。但是你应该可以使用softValues 和expiration,只要重新创建一个被驱逐的条目没有副作用。
【讨论】:
MapMaker.maximumSize() 是ConcurrentLinkedHashMap 的长期替代品。如果社区达成共识,CLHM 仍然是改进算法的试验台,以便以后移植。不过,我预计 v2.0 将是在将这些改进移植到 MapMaker 之后的最后一个版本。该项目将根据需要保持活跃,因为它拥有良好的用户群(例如 Apache Cassandra)。我很高兴 Guava 包含了它。
【讨论】: