是否有针对Java的开源堆外缓存解决方案?
Terracotta BigMemory有开源的替代方案吗是否有针对Java的开源堆外缓存解决方案?,java,caching,memory,Java,Caching,Memory,Terracotta BigMemory有开源的替代方案吗 事实上,我甚至没有找到任何商业替代品。我对纯Java解决方案感兴趣,它可以在JVM内部工作,而不需要任何JNI和C支持的解决方案。看起来apache有一个提议: 我正在开发一种更快的解决方案,但我不建议您现在就使用它,因为它只是现阶段的概念证明 但是,如果您有特定的需求,那么自己编写代码、使用直接字节缓冲区或内存映射文件可能会更容易 e、 g 对于内存映射文件,也可以执行类似的操作。内存映射文件不会计入直接内存限制,也不会占用交换空间
事实上,我甚至没有找到任何商业替代品。我对纯Java解决方案感兴趣,它可以在JVM内部工作,而不需要任何JNI和C支持的解决方案。看起来apache有一个提议:
我正在开发一种更快的解决方案,但我不建议您现在就使用它,因为它只是现阶段的概念证明 但是,如果您有特定的需求,那么自己编写代码、使用直接字节缓冲区或内存映射文件可能会更容易 e、 g 对于内存映射文件,也可以执行类似的操作。内存映射文件不会计入直接内存限制,也不会占用交换空间
你确定BigMemory不会为你做这项工作吗?尽管它不是一个解决方案,但Keith Gregory已经为你的用例编写了一本关于如何使用ByteBuffers的指南。请看一看,了解概述和基本细节。有一个非常好的缓存解决方案,名为(以前是JDBM4)。它支持
HashMap
和TreeMap
,但它是唯一嵌入的应用程序。它还支持基于文件的持久缓存
堆外缓存示例:
DB db = DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache");
DB DB=DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap=db.getTreeMap(“MyCache”);
或基于文件的持久缓存:
DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");
DB DB=DBMaker.newFileDB(新文件(“/home/collection.DB”)).closeOnJvmShutdown().make();
ConcurrentNavigableMap=db.getTreeMap(“MyCache”);
我自己也有这个问题,所以我要用我的发现更新之前的答案
我在quora找到了这条线,它也谈到了同样的问题:
除了directmemory(去年没有真正更新过)之外,另一种似乎很适合的解决方案是
- MapDB—这似乎是一个非常完整的解决方案,它比堆外缓存做得更多,并且支持很多功能
- HugeCollections——这似乎比MapDB要简单得多,后者通过扩展ConcurrentMap和Map来分配堆外数据。其中一个以Java8为目标的fork项目是编年史地图。一篇关于这方面的好文章是
- 这是一个非常简单的单线程实现,在github上享有良好声誉
- xmemcached——这在github上也有着良好的声誉,但它似乎并没有得到太多的讨论
- 快速序列化-还关注于重新实现Java序列化,重点是内存的堆外使用-
然而,我更感兴趣的是找到一个足够大的应用程序,可以使用这三种应用程序中的任何一种:directmemory、SpymeCached和xmemcached。如果我找到了,我将更新此答案。此java非堆缓存的实现使用直接内存,并在轻量级java库中提供良好的性能:
查看基准测试部分,了解性能数据。它是根据Apache2授权的。我想要一个免费的工具,这样BigMemory就不会出现问题。我自己编写代码并不容易,因为我需要从缓存中添加和删除数据,所以我必须在分配的缓冲区中编写一些类似于GC的复杂逻辑。快速向前6年,这个项目现在被称为@peter lawrey可以解决类似的问题:这个建议已经被接受。DirectMemory位于上。该项目的使用寿命不长,现在已退役。这与另一个答案相同,DirectMemory现在位于上。@javanna该项目现在退役:它是磁盘备份的解决方案。这并不是我想问的。值得一提的是,MapDB是在Kotlin中开发的,并且将对其运行时产生依赖。
DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");