Node.js中速度最快,非基于内存的多进程键值存储

Rub*_*rgh 28 key-value redis key-value-store node.js leveldb

Node.js支持多个进程的最快的非内存键值存储是什么?

我需要存储简单的键值字符串/字符串对(不是文档或JSON,只是字符串).
以下是一些示例(将有数百万个):

  • 12345678 - abcdefghijklmnopabcdefghijklmnop
  • 86358098 - ahijklmnopbcdefgahijklmnopbcdefg
  • abcdefghijklmnopabcdefghijklmnop - 12345678
  • ahijklmnopbcdefgahijklmnopbcdefg - 86358098

我试过了:

  • Redis:它真的很快,可以完成我需要的一切,但是占用的内存太多了.
  • LevelDB:它在RAM上速度快且不太重,但只有单一进程.

LevelDB的解决方法是多级的,它通过HTTP公开单个LevelDB进程.
但那当然需要付出代价; 我需要快速的东西.

是否有任何键值存储:

  • 支持Node.js或具有绑定;
  • 存储字符串/字符串对;
  • 支持多个流程;
  • 并不完全存在于记忆中;
  • 很快?

我只关心阅读.快速的多进程读取是必要的,但不是写入.
我对LevelDB的当前速度感到满意,只是因为它是单进程的事实.


额外细节:

  • 我说的是大约5000万个键/值对,键和值在8到500个字符之间.
  • 代码将在常规Linux服务器上运行.
  • 内存使用量应限制在几千兆字节(4GB很好,8GB是可以接受的)
  • 阅读不仅仅是写作; 实际上,我可以不写作.
  • 速度比任何事情都重要(考虑到内存和多进程约束).

Did*_*zia 24

我建议看看LMDB(这是OpenLDAP最有效的引擎,并用于其他一些开源项目).

LMDB是一个嵌入式键/值存储,具有Berkeley-DB或LevelDB之类的API,不必将所有内容存储在内存中,并且可以支持来自多个进程的访问.有Node.js绑定:

  • @JPRichardson LMDB对我来说是一个很好的解决方案! (6认同)

Pol*_*eer 7

您可以尝试ssdb使用基于leveldb的redis协议兼容数据库.

https://github.com/ideawu/ssdb

您可以使用现有node-redis客户端,但某些命令可能会有所不同.

基准:

                  Redis (100.000x)
      13,540 op/s ? set small
      13,289 op/s ? set medium
      13,279 op/s ? set large
      13,651 op/s ? get large
      13,681 op/s ? get medium
      14,428 op/s ? get small

                  SSDB (100.000x)
      12,252 op/s ? set small
      11,824 op/s ? set medium
      11,720 op/s ? set large
      13,810 op/s ? get large
      13,593 op/s ? get medium
      12,696 op/s ? get small


                  lmdb (100.000x)
       4,616 op/s ? set small
      11,104 op/s ? set medium
      17,283 op/s ? set large
      13,778 op/s ? get large
      16,002 op/s ? get medium
      50,562 op/s ? get small

                  multilevel (100.000x)
       6,124 op/s ? set small
       5,900 op/s ? set medium
       5,944 op/s ? set large
       6,215 op/s ? get large
       6,125 op/s ? get medium
       6,310 op/s ? get small
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,ssdb几乎与redis一样快,并且它专为持久存储而设计.lmdb提到@ didier-spezia对于获取小数据非常快,但设置一个很慢.


Amn*_*non 5

FaceBook 的RocksDB应该很快(特别是在 SSD 存储上),还有其他的,例如 LMDB(已经提到)和WiredTiger

您提到 Redis - 如果您想使用 Redis API,但使用上述键/值数据库之一作为存储而不是 RAM,我知道有两个项目(尽管尚未测试它们):LedisDB (用 Go 编写)和ardb(用 C++ 编写)。

我最近开始测试一个看起来非常有前途但鲜为人知(尽管我确信这会改变)的名为CuttDB的键值数据库库。它具有非常快的性能,旨在处理 HDD 上的大量数据。它甚至包括 Memcached 服务器接口。


Ale*_*Gad 3

您将遇到的问题是“闪电般的速度”和磁盘不能混合,特别是如果您像在键值系统中那样进行随机访问读取。您需要将尽可能多的数据放入内存,因为从内存读取比从磁盘读取要快很多数量级。

您想要最小化内存的原因是因为这将是一个嵌入式数据库吗?如果是这样,您可能想看看 Empress - http://www.empress.com。已经在几个项目中使用过它,您可以配置加载的数量。然而,它有 RDBMS 的开销,所以不确定它是否会像您想要的那样精简。

您还可以考虑使用带有 Memcache 插件的 MySQL。这允许您使用 MySQL 作为键值存储。因为跳过了 SQL 层处理,所以比常规 MySQL 快得多。此外,使用 MySQL,您可以转动旋钮来控制使用了多少内存。

Firebird 是另一个低内存使用数据库 - http://www.firebirdnews.org/docs/fb2min.html

无论如何,希望这会有所帮助。如果没有对您的需求进行更深入的解释(这是嵌入式的,为什么需要节省内存,如果内存很宝贵,您认为低内存消耗是什么,您是否需要酸,冗余,您认为闪电速度是什么,等等)很难提供更多的分析。