【问题标题】:Is there a open-source off-heap cache solution for Java?是否有适用于 Java 的开源堆外缓存解决方案?
【发布时间】:2011-10-09 19:15:35
【问题描述】:

Terracotta BigMemory 是否有任何开源替代方案?

实际上,我什至没有找到任何商业替代品。我对纯 Java 解决方案感兴趣,它可以在 JVM 中运行,无需任何 JNI 和 C 支持的解决方案。

【问题讨论】:

    标签: java caching memory


    【解决方案1】:

    此 Java 堆外缓存的实现使用直接内存并在轻量级 Java 库中提供良好的性能:

    https://github.com/snazy/ohc

    查看性能数据的基准测试部分。它在 Apache 2 下获得许可。

    【讨论】:

      【解决方案2】:

      有一个非常好的缓存解决方案,名为MapDB(以前是JDBM4)。它支持HashMapTreeMap 但它只是嵌入应用程序。它还支持基于持久文件的缓存。

      堆外缓存示例:

      DB db = DBMaker.newDirectMemoryDB().make();
      ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache");
      

      或基于持久文件的缓存:

      DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
      ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");
      

      【讨论】:

      • 它是磁盘支持的解决方案。不是我要问的。
      • 值得一提的是,MapDB 是在 Kotlin 中开发的,并将对其运行时施加依赖。
      【解决方案3】:

      【讨论】:

      • 提案已被接受。 DirectMemory 位于Apache incubator
      • 那个项目寿命不长,现在已经退役了。
      【解决方案4】:

      我自己也有这个问题,所以我将用我的发现更新以前的答案。

      我在 quora 上找到了这个帖子,它也谈到了同样的问题:

      http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache

      除了directmemory(去年还没有真正更新)之外,似乎很合适的不同解决方案是

      • MapDB - 这似乎是一个非常完整的解决方案,它的功能远不止堆外缓存,还支持很多功能
      • HugeCollections - 这似乎是一个比 MapDB 简单得多的应用程序,它专注于通过扩展 ConcurrentMap 和 Map 来分配堆外数据。一个针对 Java 8 的分支项目是 Chronicle-Map。关于这个的一篇不错的文章是 http://blog.shinetech.com/2014/08/26/using-hugecollections-to-manage-big-data/
      • SpyMemcached - 这是一个非常简单的单线程实现,在 github 上享有很高的声誉。
      • xmemcached - 这在 github 上也有相当的声誉,但似乎并没有被太多人谈论。
      • 快速序列化 - 还专注于重新实现 Java 序列化,专注于内存的堆外使用 - http://ruedigermoeller.github.io/fast-serialization/

      但是,我还有兴趣找到一个足够大的应用程序,它使用以下三种中的任何一种:directmemory、SpyMemcached、xmemcached。如果我找到一个,我会更新这个答案。

      【讨论】:

        【解决方案5】:

        我正在开发一个更快的解决方案,但我不建议您立即使用它,因为它只是现阶段的概念证明。

        http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html

        但是,如果您有特定要求,自己编写代码,使用直接 ByteBuffers 或内存映射文件可能会更容易。

        例如

        // using native order speeds access for values longer than a byte.
        ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*1024).order(ByteOrder.nativeOrder());
        // start at some location.
        bb.position(0);
        bb.put((byte) 1);
        bb.putInt(myInt);
        bb.putDouble(myDouble);
        
        // to read back.
        bb.position(0);
        byte b = bb.get();
        int i = bb.getInt();
        double d = bb.getDouble();
        

        您可以对内存映射文件进行类似操作。内存映射文件不计入您的直接内存限制,也不会占用交换空间。

        您确定 BigMemory 不会为您完成这项工作吗?

        【讨论】:

        • 我想要免费的工具,这样 BigMemory 就不能用了。自己写代码不是那么容易,因为我需要在缓存中添加和删除数据,所以我必须在分配的缓冲区中编写一些类似于 GC 的复杂逻辑。
        • 快进6年,这个项目现在叫Chronicle Map
        • @peter-lawrey Chronicle 能否解决类似的问题:stackoverflow.com/questions/63926180/…
        【解决方案6】:

        【讨论】:

        【解决方案7】:

        虽然它不是一个解决方案,但 Keith Gregory 已经撰写了关于如何将 ByteBuffers 用于您的用例的指南。请查看http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf 以获取概述,查看http://www.kdgregory.com/index.php?page=java.byteBuffer 以获取详细信息。

        【讨论】:

          猜你喜欢
          • 2010-09-19
          • 1970-01-01
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 2011-03-01
          • 2013-09-12
          • 1970-01-01
          相关资源
          最近更新 更多