代码之家  ›  专栏  ›  技术社区  ›  yazz.com

如何在最终一致的数据库上实现列表?

  •  0
  • yazz.com  · 技术社区  · 14 年前

    我希望通过Cassandra、Riak或任何其他最终一致的存储实现列表和队列。这可能吗?我该怎么做?

    我正在寻找一个通用算法。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Kabhal Eleasar    10 年前

    我不完全明白。什么列表/队列?您可以创建一个(一个/多个)文档,其中包含每个队列/列表。你是说查询之类的(听起来有点像SQL思维)?

    在这里可以找到一篇关于建模和不建模的非常好的文章:

    http://ayende.com/blog/4465/that-no-sql-thing-the-relational-modeling-anti-pattern-in-document-databases

    怎么做 http://ayende.com/Blog/archive/2010/04/21/that-no-sql-thing-modeling-documents-in-a-document-database.aspx

    如果我理解错了,请澄清:)

        2
  •  1
  •   GalacticJello    14 年前

    你可以走另一条路,使用Lucene存储你的“列表”,只需在Lucene中添加一列作为“对话索引”或你正在做的任何事情。

    Lucandra 项目以获取更多信息。此外, Sematext blog 写得很好。

        3
  •  1
  •   nickname    14 年前

    免责声明:

    我假设您能够存储和访问“键值对”(即一对值(a,b),其中a是值b的键)。

    实施链表

    假设您有一个键值对(键,值)和一个对象[字段:值…],可通过以下方式在数据库中实现链表:

    1. 通过定义对象[字段:值…下一个]或

    也可以将链表的第一个值存储在一些特殊的键值对中,如(first,…)。

    无论哪种情况,都可以在数据库中实现链表。

    从键值对中提取值时,要获取下一个值,只需找到持有者或对象的“下一个”字段,即可遍历列表到下一个值,以此类推。

    链表算法示例

    搜索:

    def find(first, node):
        if node = first[next]:
            return first[next]
        else:
            find(first[next], node)
    

    搜索前任:

    def find_pred(first, node):
        if node = first[next]:
            return first
        else:
            find_pred(first[next], node)
    

    在特定节点之前插入:

    def insert_at_front(node, inserted_node):
        find_pred(node)[next] = inserted_node
        inserted_node[next] = node
    

    队列的实现

    在这种情况下,队列可以是一个链表,其中自动知道两个特定值(可能存储在数据库中):

    1. 可以与特殊键值对(head,…)一起存储的第一个元素(或head)
    2. 可以与特殊键值对(tail,…)一起存储的最后一个元素(或tail)

    注意:这些算法是特意简化的;它们不是用任何特定的语言编写的,不处理异常、列表末尾等,不应该用于诸如此类的东西。。。。等

        4
  •  1
  •   Damodharan R    14 年前
        5
  •  1
  •   j-g-faustus    14 年前

    不确定您想要支持什么操作,也不熟悉Riak等人,但这里有一个CouchDB的可能实现,这是另一个最终一致的DB。

    我假设map/reduce操作返回一个或多个键/值对,结果按键排序顺序返回,查询键和键范围是基本操作。(CouchDB这样做,不知道其他人。)

    假设您想要支持迭代、推送和弹出,您可以使用

    • 文件ID :可以是UUID或其他有意义的东西,以便每个条目都获得唯一的ID,并且在合并期间不会导致冲突。
    • 等级键 [123, "client1"] 你会先分类吗 [123, "client2"] (这里的细节可能会因DB而有所不同,但即使键只是字符串,也可以使用此技巧。)
    • 价值 :此列表元素的内容

    行动是

    • :返回按秩键排序的所有元素,在客户端上迭代。如果数据集是海量的,则迭代关键子范围。
    • ,
    • :插入秩键高于现有最高值的新文档。
    • 流行音乐