我想在 Java 中实现一个 Cache,它应该缓存给定 id 的标签。 (一个id对应0-N个标签)
1 亿个实体中大约有 1000 个唯一标签,但实际数量可能存在几千个差异。
它不需要考虑 id/tag 驱逐。
如果存在的标签数量多于我们可以在内存中缓存的数量,则缓存预计会抛出 OutOfMemoryError。
然而,设计应该确保缓存标签占用尽可能少的内存。
缓存有一个方法 “getTags()”方法采用 id 并返回实体的标签。
这种方法在最坏的情况下(禁止垃圾收集)需要花费一些时间 100纳秒。几毫秒的时间可以称为数千秒。 缓存应设计用于 1000 个多线程访问 几毫秒内对 getTags 的请求。
请建议一个好的数据结构/集合来使用,它可以为我提供这样的性能。
最佳答案
要选择具有良好内存读取性能的良好缓存,请查看 cache2k benchmark page 中的基准测试。 。它比较了 EHCache、guava cache、cache2k 和 Infinispan。
如果你不需要驱逐,那为什么还需要缓存呢?无论如何,在cache2k中可以切换到开销非常低的驱逐实现,如下所示:
Cache<String, String> c =
CacheBuilder.newCache(String.class, String.class)
.source(new CacheSource<String, String>() {
@Override
public String get(String o) {
... fill code ...
}
})
.implementation(ClockCache.class)
.build();
另一个低开销的驱逐是 org.cache2k.impl.RandomCache,它只是通过遍历哈希表的循环指针来选择驱逐候选者。不同的算法未在 API 模块中公开,因此您需要在编译范围内包含 cache2k-core.jar
。
免责声明:我的工作是cache2k ...
关于java - 在 Java 中实现缓存以实现读取性能且完全不驱逐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22087566/