实例缓存清理

问题描述 投票:1回答:1

我有一个对象/类ClassA,其实例需要使用数千个键进行缓存(我们将其称为cache1)。但是实际上,ClassA的实例数限制为数百。

所以我想通过重用ClassA实例来压缩缓存的堆使用。

一种简单的方法是使用一个简单的池(也许这不是一个公共池):

final class ClassA {

    private byte[] bytes;
    private static final ConcurrentHashMap<String, ClassA> instancePool = new ConcurrentHashMap<>();

    private ClassA(String bigString) {
        bytes = bigString.getBytes();
    }

    public static ClassA getInstance(String key) {
        instancePool.putIfAbsent(key, new ClassA(key));
        return instancePool.get(key);
    }

    public byte[] getBytes() {
        return bytes;
    }
}

有效。但是问题在于实例可以更改,甚至不经常更改。缓存可以过期,但instancePool不能过期。因此它将容纳越来越多的无用实例,对我而言,这就像一颗定时炸弹。

所以我想从池中清除无用的实例(不由cache1引用)。一个简单的想法是使用另一个cache(cache2)而不是instancePool。并给它更长的到期时间。但这似乎不是理想的方法。

这似乎是一个普遍的问题。有库可以这样做吗?

java caching pool
1个回答
1
投票

如果要根据时间使对象过期,可以使用jodah中的ExpiringMap

赞:

Map<String, Integer> map = ExpiringMap.builder().expiration(30, TimeUnit.SECONDS).build();
© www.soinside.com 2019 - 2024. All rights reserved.