java - 在 Java 中实现缓存以实现读取性能且完全不驱逐

标签 java performance caching

我想在 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/

相关文章:

java - 如何将 EL 2.2 与 Websphere 7.0 和 JSF 2.1 Mojjarra 结合使用

java - 正则表达式在字符串中查找价格

java - 如何以编程方式查找对某个方法的所有引用?

c# - 缓存已编译的 lambda 表达式

mysql - 使用 OR 时的 SQL 性能问题

c# - 需要一种策略来缓存有关对象的信息而不使其保持事件状态

caching - 如何清除 Varnish 中的完整缓存?

java - 慢速多线程 java 应用程序 : is this due to access to static object?

javascript -/_layouts/xxx.debug.js 文件不能全部提供给最终用户吗?共享点 2010

java - Spring 缓存代理不适用于在 xml 中加载的 bean 与在 @Configuration 中加载的 beans