Couchbase 中的 REQUEST_PLUS 和 STATEMENT_PLUS ScanConsistency 到底有什么区别?

What exactly is the difference between REQUEST_PLUS and STATEMENT_PLUS ScanConsistency in Couchbase?

我无法理解请求和声明之间的区别以及一致性与它们之间的关系。

  • RequestPlus 确保查询时所有文档都已编入索引。
  • AtPlus(或StatementPlus)确保指定的文档已被索引。
    • 这允许在不延迟其他写入的情况下读取您自己的写入。

例如:

  1. 存储桶 B 包含一个文档。
  2. SELECT COUNT(1) FROM B -> 结果是 1.
  3. 您插入了 ID 为 a
  4. 的文档
  5. 插入了另一个 ID 为 b
  6. 的文档
  7. SELECT COUNT(1) FROM B
    • 与"Not Bounded"(默认)一致性->返回至少1的即时结果。
    • 具有 "AtPlus" 一致性,指定 a 发生突变的附加状态 -> 在索引中更新文档 a 后至少 2 的结果。
    • 具有 "RequestPlus" 一致性 -> 3 索引完全赶上后的结果。

一些补充说明。

无论好坏,Couchbase 允许您控制在执行查询后何时更新索引。非常不幸的是,执行查询时的默认行为是一种 'eventual' 一致性。

实际上,这意味着顺序查询(其中第二个查询取决于第一个查询的结果)极有可能失败并产生不一致的结果,因为所使用的索引执行第二个查询尚未更新。

选择最终一致性作为 Couchbase 中的默认选项让我感到困惑。性能很重要。但可以说很少,如果有的话,比一致性更重要(批量插入后忘记操作除外),并且 尤其是 不在网络中应用上下文。

因此,除非您将 Couchbase 用作纯数据仓库(主要是写入,很少读取),否则您需要记住为绝大多数查询手动将一致性设置为 REQUEST_PLUS,或为疯狂做好准备。