【问题标题】:Sorted Key/Value Database solution排序键/值数据库解决方案
【发布时间】:2012-09-04 05:14:19
【问题描述】:

我正在寻求实施一种数据库解决方案,以支持对一组简单的 2D 数据集进行非常快速的基于列的访问。即考虑这个数据集

==========================================================
                     SOME DATASET1
==========================================================
   ENTRY     |    Col1   |   Col2  |    Col3    ... Coln
----------------------------------------------------------
   ENTRY A        1.1        0.2         5.5       6.2
   ENTRY B        2.3        6.4         1.5       1.1
   ENTRY C        2.2        4.2         9.5       3.4
   ENTRY D        2.3        1.1         5.5       2.9
   ENTRY E        9.1        3.6         7.5       2.6

我需要的是一种方法,可以简单地选择 column1、column2 或 column n 中的所有值,同时保留排序顺序。我最初的想法是使用 redis,具有以下键空间设计:

   SOMEDS1/COLUMNS/           =>     Col1, Col2, Col3 ... Coln
   SOMEDS1/ENTRIES/           =>     A, B, C, D, E
   SOMEDS1/Col1/              =>     1.1, 2.3, 2.2, 2.3, 9.1
   SOMEDS1/Coln/              =>     ......

这种设计背后的原则是每个列表中的条目数量不大,可能

我的问题是,有没有人已经实现了这样的东西,如果有,您能否就最合适的数据库类型提出建议。我最初的想法是使用 redis,但我愿意接受建议。

【问题讨论】:

    标签: database redis key-value-store


    【解决方案1】:

    您没有指定是否需要对数据存储进行本地或远程访问。如果你需要远程访问,那么 Redis 可能是一个非常好的解决方案。如果您的访问是纯本地的,嵌入式数据库(例如 BerkeleyDB)可能会更有效。

    重点是定义如何维护数据:是否只能在数据结构的末尾添加新条目?如果是,Redis 列表将飞来存储您的列。如果不是这样,将您的数据保持在每列的哈希对象(关联的条目和值)中可能会更好。如果条目数很少,在客户端检索后对数据进行排序无论如何都很便宜。

    此设计类似于您可以在某些列式数据库中找到的实现。这种方法的主要好处是系统可以以高压缩率压缩给定列的值,这在数据量很大时很有趣。缺点是数据的实时维护比较困难。对于 MySQL 的示例,您可能需要查看 InfobrightCalpont 产品。

    在您的情况下,如果数据量有限,Redis 非常适合。但请注意,当条目数量变得很大(即超过here 描述的阈值)时,这些数据在内存中的表示将不会特别紧凑(涉及指针、双链表和/或哈希表)。

    【讨论】:

    • 对不起,忘了说数据是远程访问的。此外,数据属性并不总是事先知道,这就是为什么我不看经典的“列存储”解决方案的原因。这种设计将使我能够灵活地快速访问特定列,而无需提前知道这些列。我认为您是关于列压缩的观点,但分区快速访问对于解决方案更为重要,这也是选择此设计的原因。你知道将 vm-max-memory 设置为 0 并将其用作磁盘 DB(在内存中有键吗?)的影响?
    • VM 实现已弃用。它在 2.6 中消失了。 Redis 现在是一个纯内存存储(具有可选的磁盘快照或日志记录)。虚拟机管理不适合 Redis 模型(单线程事件循环)。
    • 啊,我明白了。那么这个解决方案可能不可行。我负担不起将所有数据加载到内存中,它会太多。你知道 MongoDB/CouchDb 是否更适合 key:SomeVal 和 Value:A list of entries。
    • 你可以用 MongoDB 做到这一点,通过一个包含文档的集合(每列一个),每个文档都包含一个数组。请注意,MongoDB 中文档的大小限制为 16 MB。
    • 嗯... 16MB 太小了。我也看过 GridFS,但它似乎不支持查询实际数据。它只是将其分成块并让您保存/检索它。您知道有没有专门用于存储有序列表集的数据库?
    【解决方案2】:

    我在 Redis 中存储数据是这样的:

    字符串:

    Entry:A:Col1 => 1.1
    Entry:A:Col2 => 0.2
    Entry:A:Col3 => 5.5
    ...
    Entry:A:ColN => 6.2
    

    您可以使用无限数量的列(受物理内存限制)

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 2018-05-26
      • 2022-01-18
      • 2018-08-12
      • 2011-08-21
      • 1970-01-01
      • 2018-06-07
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多