我的node.js服务的最佳键值存储

时间:2012-03-27 10:10:39

标签: node.js solr nosql redis key-value-store

我需要编写一个带有键值存储作为后端的node.js服务。我的数据如下:

Item
  Name: "Item 1"
  Attributes
    AttributeA: "ValueA"
    AttributeB: "ValueB"
    AttributeC: "ValueC"

Item
  Name: "Item 2"
  Attributes
    AttributeA: "ValueC"
    AttributeB: "ValueD"

我问自己,这是我要求的最佳后端。我需要一个快速后端,可以从node.js轻松访问,并且可以处理大量数据(1-2百万项,15-20个属性)。重要的是,属性可能因项目而异,因此没有20个修复属性。我以后的查询看起来像这样:

  • 获取第1项的所有属性
  • 获取attributeA的所有值(来自所有项目)
  • 获取包含attributeB
  • 的所有项目

或者像couchDB这样的noSQL数据库会更好?一些提示我会很感激。 ;)

谢谢

托本

3 个答案:

答案 0 :(得分:3)

虽然它可能取决于其他参数(如属性的大小,类型,读/写比率),但我认为像MongoDb这样的文档数据库(ou couchDb,即使我没有使用它个人)会很合适。原因是你想根据属性的'值'进行查询,这在像Redis这样的数据库中是不可能的(没有改变你提出的模式,即使Redis非常适合许多用例) )。

使用以下文档:{name:“Item 1”,AttributeA:“ValueA”,AttributeB“ValueB”...},您可以实现您提到的查询:

db.docs.find({name:“Item 2”}); (如果经常使用此查询,可能会在名称上设置索引) db.docs.distinct( 'attributeA'); db.docs.find({attributeB:{$ exists:true}}});

依旧......

你可以在这里找到一个非常好的nodejs mongodb驱动程序:https://github.com/christkv/node-mongodb-native

希望这有帮助!

答案 1 :(得分:1)

我认为mongoDB非常适合你。它不是一个键/值存储,但它是一个文档存储,有点不同。

这是与nodejs的mongo有什么好处:

  • 索引密钥。
  • 复合索引允许快速多属性查询。
  • 模式少。您可以根据需要添加/删除属性。如果您没有某些项目的属性,这对您有好处。
  • 很快,我用它完成的所有事情都非常快。
  • 为大量文件而制作。正确编入索引的数以百万计的物品只会使mongodb对任何疑惑都笑。
  • 强大。像findAndModify和map / reduce这样的东西给你惊人的灵活性。大多数时候你甚至都不需要它们。
  • 熟悉的javascript语法。 this.db.items.findOne({attrA:'value'})感觉很对。

以下是一些限制:

  • 似乎每个人都启动了node-js / mongodb驱动程序。最完整的https://github.com/christkv/node-mongodb-native,有一些可用性问题。你的代码最终看起来非常回调驱动。
  • 每份文件限制16mb。通常不是问题,但需要注意的事项。
  • Sharding是一项工程/设计练习。这不是太复杂,但确实需要一点预见。我将从一台服务器开始,并根据需要进行扩展。
  • 您需要64位服务器。在这一天通常不是问题,但需要注意的事项。

一如既往,了解您的工具。我建议你阅读这本书:http://manning.com/banker/。写得很好。

答案 2 :(得分:0)

如果你想使用Redis来做这件事有点棘手。

处理具有特定属性的所有项目的检索。为每个属性设置一个集合。每次添加项目时,如果它具有该属性,则将其添加到集合中。当您想要检索具有该属性的所有项目时,只需请求整个集合,然后根据该项目检索所有项目。

添加内容

HMSET item1 attributeA value attributeB value
SADD set_attributeA item1
SADD set_attributeB item1

对于您的案例

1

HGETALL item1

2

SMEMBERS set_attributeA

然后迭代并获取所有值

HGET item1 attributeA

3

use HGETALL instead of HGET

对于节点库使用https://github.com/mranney/node_redis,它有一些很好的附加功能,比如用HGETALL的结果制作对象,以及用hmset存储哈希的对象