在没有竞争条件的情况下在Riak存储双重链表?

时间:2013-04-05 19:53:53

标签: riak

我们希望使用Riak的链接创建一个双向链表。

它的算法非常简单,我相信:

  1. 让'N0'成为要插入的新元素
  2. 获取列表的头部,包括其“下一个”链接(N1)
  3. 将N1的“上一个”设置为N0。
  4. 将N0的“下一个”设为N1
  5. 将列表头部的“下一个”设置为N0。
  6. 我们遇到的问题是这里存在明显的竞争条件,因为如果2个并发客户端获得列表的头部,则其中一个项目可能会“丢失”。有什么办法可以避免吗?

1 个答案:

答案 0 :(得分:2)

当谈到CAP定理时,Riak是一个最终一致的系统。

如果您设置了存储桶属性allow_multi=true,如果两个并发客户端获得列表的头部然后写入,您将拥有兄弟记录。在下次阅读时,您将收到多个值(兄弟姐妹),然后必须解决冲突并写入结果。鉴于我们没有任何原子性,当您尝试更新链接对象时,这可能会导致在写入并发繁重时出现额外冲突。不是不可能解决,但绝对是棘手的。

最好只将整个列表序列化为单个对象。这使您的冲突解决方案更多更简单。