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

时间:2014-01-18 13:46:28

标签: node.js redis key-value key-value-store leveldb

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

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

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

我试过了:

  • Redis :它非常快,可以完成所需的一切,但占用的内存过多。
  • LevelDB :它在内存上速度快且不太重,但只有单一进程。

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

是否有任何键值存储:

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

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


其他详情:

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

5 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:7)

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

https://github.com/ideawu/ssdb

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

benchmarks

                  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

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

答案 2 :(得分:3)

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

您提到Redis - 如果您想使用Redis API但是使用上述Key / Value数据库中的一个作为存储而不是RAM,那么我知道有两个项目(虽然没有'测试了它们):LedisDB(用Go编写)和ardb(用C ++编写)。

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

答案 3 :(得分:2)

您将要遇到的问题是“闪电般快速”和磁盘不会混合,尤其是如果您具有随机访问读取功能,就像在键值系统中那样。您需要尽可能多地将数据存入内存,因为从内存中读取比从磁盘读取要快许多倍。

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

您也可以考虑使用Memcache插件进行MySQL。这允许您使用MySQL作为键值存储。因为跳过SQL层处理,所以比常规MySQL快得多。此外,使用MySQL,您可以使用旋钮来播放使用的内存量。

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

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

答案 4 :(得分:1)

为什么不将MySQL(或MariaDB)与主从复制一起使用。 根据您的要求。 MySql的主从架构适合您。

基本上,NoSQL需要很多服务器。 例如,MongoDB的最小设置需要三台服务器,HBase需要四台服务器。

从这个角度来看,如果你需要更多的可读性,那么在mysql架构上添加一个新的从服务器。

我们假设mysql的读取性能是2k tps。 那么mysql读取性能的四个节点是8k tps。

这取决于您的测试结果和服务使用情况(读/写比率)。

检查以下链接,即“Marco Cecconi - StackOverflow的体系结构”。 http://www.youtube.com/watch?v=t6kM2EM6so4