是否有适用于 Java 的开源堆外缓存解决方案?

2022-09-01 13:54:41

Terracotta BigMemory有没有开源的替代品?

实际上,我甚至没有设法找到任何商业替代品。我对纯Java解决方案感兴趣,它将在JVM中工作,而无需任何JNI和C支持的解决方案。


答案 1

有一个非常好的缓存解决方案,名为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");

答案 2

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

我从quora中找到了这个帖子,其中也谈到了同样的问题:

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

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

  • MapDB - 这似乎是一个非常完整的解决方案,可以比堆外缓存做得更多,并支持许多功能
  • HugeCollections - 这似乎比MapDB复杂得多,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。如果我找到一个,我会更新这个答案。