用于存储二进制数据的键值数据库

7
我正在寻找一款轻量级、可靠且快速的键值数据库,用于存储二进制数据。它需要简单易用,无需服务器。大多数流行的键值数据库(如CDB和BerkeleyDB)都不支持原生存储BLOB。我错过了哪个最好的选择?
目前我选择使用SQLite,但对于我的简单用途来说它过于先进。
6个回答

10

正如之前所指出的,BerkeleyDB确实支持不透明值和键,但我建议更好的选择是LevelDB。

LevelDB:

谷歌是你的朋友 :), 他们甚至为你提供了一个嵌入式数据库:由Google提供的快速且轻量级的键/值数据库库。

特点:

  • 键和值都是任意字节数组。
  • 数据按键排序存储。
  • 调用方可以提供自定义比较函数来覆盖排序顺序。
  • 基本操作为Put(key,value),Get(key),Delete(key)。
  • 可以在一个原子批处理中进行多个更改。
  • 用户可以创建瞬态快照以获取数据的一致视图。
  • 支持数据的正向和反向迭代。
  • 使用Snappy压缩库自动压缩数据。
  • 外部活动(文件系统操作等)通过虚拟接口中继,因此用户可以自定义操作系统交互。
  • 源代码包含有关如何使用库的详细文档。

1
对于阅读此答案的人来说,LevelDB不支持并发访问,在我的情况下这是一个致命缺陷。 - hfingler

3
你为什么认为BerkDB不能存储二进制数据?从他们的文档中可以看出:
块引用: 关键字和内容参数是由datum typedef描述的对象。 datum指定由dptr指向的dsize字节的字符串。允许任意二进制数据以及普通文本字符串。
还可以查看他们的示例:examples
money = 122.45;
key.data = &money;
key.size = sizeof(float);
...
ret = my_database->put(my_database, NULL, &key, &data, DB_NOOVERWRITE);

1
如果您不需要“多个编写进程”(仅支持多个读者),想要一些小型且几乎在每个Linux上都可用的东西,您可能需要看一下gdbm,它类似于Berkeley db,但更简单。此外,它可能不太快。
在几乎相同的领域中有像TokyoCabinet、QDBM和已经提到的LevelDB这样的东西。
Berkeley db和sqlite在这些之前,因为它们支持多个编写者。Berkeley db有时是版本管理灾难。
Gdbm的主要优点:它已经存在于每个Linux上,没有版本问题,体积小。

0

使用sqlite现在变得非常简单,因为自2014-06以来,新的readfile(X)和writefile(X,Y)函数已经可用。例如,从文件中保存blob到数据库中并再次提取它

     CREATE TABLE images(name TEXT, type TEXT, img BLOB);
     INSERT INTO images(name,type,img) VALUES('icon','jpeg',readfile('icon.jpg'));
     SELECT writefile('icon-copy2.jpg',img) FROM images WHERE name='icon';

查看https://www.sqlite.org/cli.html中的"文件I/O函数"



0
你使用的是哪个操作系统?如果是Windows,你可能想要查看ESE,它是一个非常强大的存储引擎,作为操作系统的一部分进行发布。它支持Active Directory、Exchange、DNS和其他一些微软服务器产品,并被许多第三方产品所使用(RavenDB是一个很好的例子)。

1
你是否考虑过简单的“文件系统作为数据库”的选项?文件名=key,文件内容=value... - Addys
1
@Addys:我非常喜欢这个系统,你应该将它发布为一个正式的答案。 - hroptatyr
为什么人们会把答案发表在评论中?这真的很麻烦! - Jay

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