Concurrency 键/值存储如何管理并发性?

Concurrency 键/值存储如何管理并发性?,concurrency,key-value,atomicity,key-value-store,Concurrency,Key Value,Atomicity,Key Value Store,我读过许多文章,其中指出键值存储只需要两种操作: 设置(键、值) get(key) 这对于单个进程来说很好,但是当您有多个进程时,键值存储如何管理并发性?我原以为需要一个版本号(例如,一个无符号整数)用于比较和交换风格的并发。例如,这两个操作将是: 设置(键、值、版本),其中版本是条件-不匹配会导致并发错误,成功匹配会导致增量 get(key)(返回值和版本) 有两种设计。一些人在使用锁,另一些人在使用 MVCC实现无锁并发。可以总结为: 在一次读取中,数据库返回数据的最新版本 在一次写

我读过许多文章,其中指出键值存储只需要两种操作:

  • 设置(键、值)
  • get(key)
这对于单个进程来说很好,但是当您有多个进程时,键值存储如何管理并发性?我原以为需要一个版本号(例如,一个无符号整数)用于比较和交换风格的并发。例如,这两个操作将是:

  • 设置(键、值、版本)
    ,其中
    版本
    条件-不匹配会导致并发错误,成功匹配会导致增量
  • get(key)
    (返回
    版本

  • 有两种设计。一些人在使用锁,另一些人在使用

    MVCC实现无锁并发。可以总结为:

    • 在一次读取中,数据库返回数据的最新版本
    • 在一次写入中,数据库会为数据添加一个新版本
    • 在读/写并发请求的情况下,读操作将获取数据的最新版本,即当前写操作之前的版本
    • 在写/写并发请求的情况下,我认为其中一个写操作会被放弃,稍后会被重放

    大多数键/值结构在所有操作上都不是线程安全的。由用户决定如何避免数据竞争。通过使用互斥锁等来避免数据竞争?这在具有共享KV存储的独立机器上是不可能的。对于共享KV存储,它们的工作方式类似于数据库,并且通常具有不同级别的争用处理机制。你必须检查他们的具体文件。您的版本号解决方案可能是其中之一,但真正的实现更为复杂。@amirouche经过大量阅读,我发现了很多方法。除了MVCC和锁定之外,还有向量时钟、时间戳等,以及单主机和多主机(读时修复)场景的各种组合。由于应用程序“核对”(或“选择”)多个版本,因此读取时修复对于关键(如财务)数据是危险的,这允许丢弃提交的数据。ROR适用于会话、购物车等,但绝对不适用于单一来源的真实数据。@magnus请回答您自己的问题:)