2

在 Riak KV 中使用标志时,标志需要上下文。在 Elixir 客户端中,上下文由 设置Flag.new("my context"),否则会:context_required在尝试禁用标志时抛出。

现在,flag 只能存在于一个 Map 中,并且 map 中的每个元素都必须有一个 key,因此多个 flag 可以在一个 Map 中,仍然可以通过 key 来区分。

如果不区分它们,上下文的目的是什么?

4

1 回答 1

3

地图中的旗帜具有“加胜”或“真胜”的语义。这种语义是使用从 Observed-Remove CRDT Set 中借用的一种称为“Observed Remove”的因果关系技术来实现的。在许多方面,标志只是一组单个空元素,它要么在集合中(标志为真),要么不在集合中(标志为假)。

标志底部值为 False。当 Map 中没有 Flag 的 key 时,Flag 为 false。这就是为什么您不能添加具有 False 值的标志键的原因。添加密钥与将 Flag 设置为 True 相同。

添加标志会导致键获得一个点或因果标记。如果该标志同时添加两次,它将有两个这样的因果标签。当标志设置为 False 时,上下文或要删除的因果标签必须传递给 Riak,这确保了一些并发设置为 True(带有 tag3)在 tag1 和 tag2 被删除时不会被设置为 false。这就是添加获胜的方式!上下文促进了 Observed-Remove 部分:上下文说明了您已观察到哪些因果标签,因此您可以删除哪些标签。

于 2016-06-09T14:48:21.510 回答