键值存储是否适合需要"全部使用"?

时间:2015-02-12 04:47:01

标签: mongodb redis key-value-store document-store nosql

根据我所做的研究,我怀疑键值存储不是可行的方法,但我希望获得更多的定向输入:

  1. 确定键值存储是否是我使用的可行解决方案。
  2. 能够明确表达我更喜欢文档存储的原因。
  3. 解释我的用例

    我的应用程序包含许多"文档"。这些目前存储在一种CMIS存储库中。但是,应用程序只有在将这些文档编入索引后才会与这些文档进行交互。这意味着所有读取操作都将触及elasticsearch,并且所有写入操作都将更新elasticsearch和存储库。

    请求的功能显示当前存储库过于严格,并且没有理由在该级别强制执行模型架构。当然,这导致了对NoSQL选项的调查。

    为了填充这些"文件"进入弹性搜索索引,他们需要住在某个地方,我必须能够得到所有并在它们加载到索引时对它们进行分页(还有一些在此步骤中发生的聚合)命令填充由现有字段构建的字段。)

    现在,全部实际上是根据文档类型分阶段完成的,但这个要求可以协商,而不是简单的获取所有类型可能就足够但不理想。

    在我对键值存储的理解中,商店对它存储的值一无所知,它们只能通过键引用。这让我想知道当我不打算在任何地方维护完整的密钥列表时,我是否能够执行全部。我已经看到一些键值存储支持使用字典作为键(redis)。我不确定这是否意味着我可以按类型查询(如果它是字典中的条目),或者我是否需要知道完整字典才能获取值?

    由于索引的数量只需要在弹性搜索失败时发生,因此性能不是我的首要任务(但肯定不会受到伤害)。对我来说,MongoDB似乎是一个近乎完美的契合。我可以存储文档并按类型轻松查询。

    • 根据我的用例,文档存储看起来是一个好的决定吗?
    • 这可以通过键值存储合理地解决吗?
    • 使用一个在另一个上有其他任何好处吗?

    如果重要,对于文档商店,我一直在比较CouchDB,Couchbase和MongoDB。对于键值商店,我一直在关注Redis和BerkeleyDB。

2 个答案:

答案 0 :(得分:0)

AFAIK,Redis不允许使用字典作为键,除非通过外部键使用sort function。 对于您的用例,使用Redis意味着您需要维护所有文档的列表和/或按文档类型列出的列表。 虽然这绝对可能,而且相当简单,但我并没有真正感兴趣在那里使用Redis。当你需要高性能时,Redis会发光。这不是您的要求,因此您最好使用文档数据库。

答案 1 :(得分:0)

在Redis中,你可以获取所有的键和值,只需要一些工作和以下命令:

  • 扫描:获取所有密钥
  • TYPE:确定键的类型(字符串,哈希,列表等)
  • MGET / HGETALL / etc:获取实际值,具体取决于密钥所指的结构。

SCAN命令也可以方便地实现,以便将所有内容转储到' redis-cli --scan'以及许多客户端库(例如Python)中。

您可能需要写一些内容才能使其适用于您的特定场景,希望不会太困难。

注意:有一个KEYS命令(与SCAN类似),不建议用于实时制作。虽然没有什么能阻止你构建一个单独的独立从属实例,但是从主服务器复制,断开与主服务器的连接,然后根据需要使用从服务器,而不会对提供实时流量的任何服务产生任何影响。