寻找一个轻量级的、兼容Java的内存中键值存储库。

17

可能最好的选择是伯克利数据库,但由于许可问题我不能使用它。

有其他替代方案吗?


@Stephen C:欢迎您进行编辑并提供更好的解释。关于“讽刺回应”:对我来说,替代Berkeley DB的选择是HashMap听起来很奇怪。 - Roman
2
点赞 - 这个问题似乎是合法的,而且没有太多的讽刺。当然,问题一开始就可以说明哈希表不行。 - tucuxi
好的 @Roman ... 你在下面的评论中所说的 "//sarcasm" 是什么意思? - Stephen C
为什么不去查看nosql-database.org的Key Value / Store部分,自己找到答案呢?使用IMDG,也是一个Key Value存储库,可以让您选择扩展。 - Basit Anwer
10个回答

8
你可以尝试使用Hazelcast。只需将hazelcast.jar添加到类路径中即可开始编程。
java.util.Map map = Hazelcast.getMap("myMap");

你将获得一个内存中的、分布式的、动态可扩展的数据网格,它可以超快地执行。

3

你的问题有两种可能的意思。

如果你的意思是用于存储键值对的数据结构,请使用JDK中标准部分之一的Map实例。

但是,如果你需要一个内存中的键值存储,则建议查看EHCache或甚至memcached


@cletus:HashMap 不是使用内存中的键值存储吗? - Ashwin

3

Chronicle-Map 是一种强大的选择。

  • 纯Java,仅使用java.util.Map实现
  • 将数据存储到堆外内存中,并可通过内存映射文件进行可选持久化
  • 开源的,使用Apache 2.0许可证
  • 极快,可管理数百万次更新和查询每秒 (查看精确数字)

2

1
它缺乏事务管理和在磁盘上保留一些数据以及另一部分在内存中等等... //讽刺 - Roman
啊,我明白了 :) 一段时间以前有个人想要为Android开发东西,但由于数据量太大,需要使用存储支持的哈希表。可能是类似的问题吧。 - Chris Dennett

2

我知道这是一篇两年前的帖子,但最近我一直在尝试使用Infinispan,到目前为止我很喜欢它。虽然我不是专家,但我成功地在几个节点上设置了一个分布式缓存,并在大约一个小时内从中获取了一些数据。


2

MapDb 是一款使用友好的 Apache 2 许可证的替代 Berkley 数据库。

  • 通过 Java 的 Map 接口提供键值存储
  • 轻量级(300KB jar 包)
  • 快速并线程安全
  • 如果需要,可以将更改持久化到磁盘
  • 许多其他功能

1
轻量级?mvn copy-dependencies 为 mapdb:3.0.5 收集了大约14 MB的依赖项。 - weberjn

1

jdbm非常适合这种情况。它旨在将数据存储在分页文件中,提供基本的事务支持(不能保证隔离性,但ACD已经覆盖)。我们在一个广泛部署的生产系统中使用它,并对其性能、稳定性等方面感到非常满意。


1

考虑使用jredis。它是Redis的Java客户端,一个持久化的键值存储。还有一个JDBC驱动程序可用:code.google.com/p/jdbc-redis/。


0

我建议尝试使用Redisson。您将能够在高性能键值Redis服务器上使用分布式和可伸缩的MapConcurrentMap以及其他实现(如Set,List,Queue,Lock...)。

简单示例:

Redisson redisson = Redisson.create();

ConcurrentMap<String, SomeObject> map = redisson.getMap("anyMap");

...

redisson.shutdown();

0

有一些轻量级或嵌入式数据库,如HSQLDB、Derby、SQLite。但是像其他人一样,不理解为什么需要一个数据库来存储键/值...

为什么不用Map呢?需要在应用重启时保留键/值吗?

另外,也许不是你所需的,但使用最新的浏览器上的HTML5,你可以使用JavaScript在浏览器中使用localStorage存储键/值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接