我想在 Web Java 应用程序中实现重量级对象的简单缓存。但我不知道如何正确地做到这一点。
我是否遗漏了什么或 ConcurrentHashMap 方法(putIfAbsent,...)不够用并且需要额外的同步?
是否有更好的简单 API(在内存存储中,无需外部配置)来执行此操作?
P.
最佳答案
根据 Ken 的回答,如果创建一个后来被丢弃的重量级对象是 Not Acceptable (出于某种原因,您想保证为每个键只创建一个对象),那么您可以通过... . 实际上,不要。不要自己做。使用 google-collections (现在 guava ) MapMaker class :
Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
.makeComputingMap(new Function<KeyType, HeavyData>() {
public HeavyData apply(KeyType key) {
return new HeavyData(key); // Guaranteed to be called ONCE for each key
}
});
然后一个简单的 cache.get(key)
就可以工作 并且让您完全不必担心并发和同步的棘手方面。
注意,如果你想添加一些更高级的功能,比如过期,这只是
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
如果需要,您还可以轻松地为键或数据使用软值或弱值(有关详细信息,请参阅 Javadoc)
关于java - 使用 java ConcurrentHashMap 实现缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2070407/