gpt4 book ai didi

java - 在 Java 中实现缓存以提高读取性能而完全不逐出

转载 作者:行者123 更新时间:2023-11-30 09:11:27 24 4
gpt4 key购买 nike

我想用 Java 实现一个缓存,它应该缓存给定 ID 的标签。 (一个 id 有 0-N 个标签)1 亿个实体中大约有 1000 个唯一标签,但实际数量可能相差几千个。不需要考虑id/tag驱逐。
如果存在的标签多于我们可以在内存中缓存的标签,则缓存会抛出 OutOfMemoryError。
但是,设计应确保缓存标签占用的内存尽可能少。

缓存有一个方法“getTags()”方法获取一个 id 并返回实体的标签。

这个方法在最坏的情况下(除了垃圾收集)需要几个100 纳秒。在几毫秒内可以称为1000的时间。缓存应设计为具有 1000 个的多线程访问在几毫秒内请求 getTags。

请建议使用一个好的数据结构/集合,它可以为我提供这样的性能。

最佳答案

要选择具有良好内存读取性能的良好缓存,请查看 cache2k benchmark page 中的基准测试.它比较了 EHCache、guava 缓存、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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com