用于存储大缓存的HashMap

时间:2013-02-24 15:08:04

标签: java caching hashmap

考虑有些对象需要在类中重复使用次数。 个别地,每个对象可以很大,并且这些对象的数量也可以非常大。这种对象的一个​​非常简单的例子可能是数据库中的记录。

将此类数据存储在HAshMap中,而不是每10行后再次查询数据库有助于提高性能。但是,记忆方面,这是非常苛刻的。

HashMap如何包含大量数据,但不能将所有内容保存在一个内存中。如果能按需提供对象,那最好吗?

2 个答案:

答案 0 :(得分:3)

您可以使用基于LRU的映射进行缓存,并确定缓存大小的长度在Least-Recently-Used对象将保留在内存中的位置。

在java中[LinkedHashMap][1]很容易得到这样的地图。

final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // Returns true if this map should remove its eldest entry
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

您还可以使Map同步。

Map m = Collections.synchronizedMap(cache);

答案 1 :(得分:1)

通常,在实现可能较大的缓存时,您需要使用SoftReference s。通常它看起来像这样:

private final Map<KeyType, Reference<MyLargeObject>> cache =
    new HashMap<>();    // Or LinkedHashMap, as per Quoi's suggestion

public MyLargeObject getCachedValue(KeyType key) {
    Reference<MyLargeObject> ref = cache.get(key);
    return (ref != null ? ref.get() : null);
}

public void addToCache(KeyType key, MyLargeObject value) {
    cache.put(key, new SoftReference<MyLargeObject>(value));
}

SoftReference保存一个对象,但如果内存变紧,则允许对该对象进行垃圾回收。如果对象确实收集了垃圾,SoftReference.get()将返回null。