使用Java客户端的键值数据库

时间:2011-02-03 00:12:33

标签: java mongodb redis database nosql

我基本上想在磁盘上存储哈希表,以便稍后查询。我的程序是用Java编写的。 哈希表从String到List。

那里有很多键值商店,但经过大量的研究/阅读后,不清楚哪一个最适合我的目的。以下是一些对我很重要的事情。

  1. 简单的键值存储,允许您使用单个键检索值。
  2. 记录良好的优秀Java客户端。
  3. 数据集很小,不需要高级功能。同样,我希望它很简单。
  4. 我研究过Redis和MongoDB。两者看起来很有希望但不适合我的目的。 任何信息将不胜感激。

5 个答案:

答案 0 :(得分:4)

您正在寻找的是支持object prevalence的库。这些库旨在简单快速地提供类似API的集合。下面是一些允许您使用集合但在幕后使用磁盘存储的库。

  1. space4j
  2. Advagato
  3. Prevayler

答案 1 :(得分:3)

如果您的数据集很小并且您希望它是简单的。为什么不将hashmap序列化为文件或rdbms并将其加载到应用程序中?

你怎么不“查询”你的hashmap?关键近似?价值'相似'?我不知道,仅仅是为了保留一个关键值存储对我来说似乎有点过分。

答案 2 :(得分:2)

查看JDBM2 - http://code.google.com/p/jdbm2/

我参与了JDBM 1代码库,并对我在jdbm2中看到的内容印象深刻

答案 3 :(得分:2)

在提供任何类型的答案之前,我首先要问自己为什么我需要将此哈希表存储在磁盘上,因为根据您的描述,数据集很小,所以我认为它可以适合内存。如果只是为了能够在重新启动应用程序后重用此结构,那么您可以使用任何类型的格式来保留它。

其次,您没有提供Redis或MongoDB不理想的任何理由。根据你的(短)3要求,我会说Redis可能是你最好的选择:

  • 优秀的Java客户
  • 不仅能够存储列表,还支持列表值的操作(因此数据不透明)

我可以假设消除Redis的唯一原因是您正在寻找严格的ACID特性。如果这就是你要找的东西,你可能会看看BerkleyDB JE。它已经存在了一段时间,文档很好。

答案 4 :(得分:0)

Chronicle Map应该是一个完美的契合,它是一个用纯Java编写的可嵌入键值存储,因此它可以作为最好的"客户端" (虽然实际上没有"客户端"或者#34;服务器",您只需打开数据库并对其进行完全读取/更新进程内访问。)

Chronicle Map驻留在一个文件中。这个文件可以在文件系统中移动,甚至可以发送到具有不同操作系统和/或体系结构的另一台机器,并且仍然是一个可打开的Chronicle Map数据库。

创建或打开数据存储(如果数据库文件不存在,则创建它,否则访问现有存储):

ChronicleMap<String, List<Point>> map = ChronicleMap
    .of(String.class, (Class<List<Point>>) (Class) List.class)
    .averageKey("range")
    .averageValue(asList(of(0, 0), of(1, 1)))
    .entries(10_000)
    .createPersistedTo(myDatabaseFile);

然后,您可以使用创建的ChronicleMap对象,就像使用简单的HashMap一样,而不必担心键和值序列化。