Terracotta BigMemory有没有开源替代品?
实际上我甚至找不到任何商业选择。我对纯Java解决方案很感兴趣,它可以在没有任何JNI和C支持的解决方案的情况下在JVM中运行。
答案 0 :(得分:19)
有一个名为MapDB的非常好的缓存解决方案(以前是JDBM4)。它支持HashMap
和TreeMap
但它只是嵌入了应用程序。它还支持基于持久文件的缓存。
关闭堆缓存的示例:
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");
答案 1 :(得分:10)
我自己一直在提出这个问题,所以我只想用我的发现更新以前的答案。
我从quora找到了这个帖子,它也讨论了同样的问题:
http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache
除了直接记忆(去年没有真正更新)之外,似乎更合适的不同解决方案是
但是,我还有兴趣找到一个足够大的应用程序,使用以下三个中的任何一个:directmemory,SpyMemcached,xmemcached。如果我找到一个,我会更新这个答案。
答案 2 :(得分:9)
我正在开发一种速度更快的解决方案,但我不建议您仅使用它,因为它只是现阶段的概念验证。
http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html
但是,如果您有特定要求,可能更容易自己编码,使用直接ByteBuffers或内存映射文件。
e.g。
// 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不会为您完成这项工作吗?
答案 3 :(得分:8)
看起来apache有一个提案:
答案 4 :(得分:5)
答案 5 :(得分:4)
虽然它不是解决方案,但Keith Gregory已经编写了有关如何使用ByteBuffers的指南。请查看http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf以获取概述,并http://www.kdgregory.com/index.php?page=java.byteBuffer查看详细信息。
答案 6 :(得分:3)
这种java堆外缓存的实现使用直接内存,并在轻量级java库中提供良好的性能:
查看性能数字的基准测试部分。它是在Apache 2下获得许可的。