【问题标题】:Redis guarantees on XREAD return value?Redis 保证 XREAD 返回值?
【发布时间】:2020-06-26 04:09:41
【问题描述】:

可以使用 XREAD(或者可能是其他命令)自动检测数据是否写入 Redis 流吗?

更具体地说:

假设您在一个进程中将一些数据添加到 Redis 流中,并看到数据已通过某个自动生成的密钥成功添加。

XADD somestream foo bar

此 XADD 完成后,您立即在另一个进程中运行以下读取。

XREAD COUNT 1000 STREAMS somestream 0-0

这个 XREAD 是否保证返回数据?文档并不清楚成功的 XADD 是否保证读者会立即看到添加的数据,或者是否可能会有一些小的延迟。

【问题讨论】:

    标签: redis redis-streams


    【解决方案1】:

    Redis 著名的单线程architecture 回答了这个问题。当您在一个进程(客户端)上执行XADD 并且在另一个进程(客户端)执行XREAD 之后,服务器会连续执行它们,这保证了在执行XREAD 之前数据将在那里。

    接下来的引用来自The Little Redis Book

    每个 Redis 命令都是原子命令,包括执行多项操作的命令。此外,Redis 在使用多个命令时支持事务。

    你可能不知道,但 Redis 实际上是单线程的,这就是保证每个命令都是原子的。 在执行一个命令时,不会运行其他命令。 (我们将在后面的章节中简要讨论缩放。)这 当您认为某些命令执行多项操作时特别有用。

    【讨论】:

    • 如果我XREAD COUNT 1000 那么如果有 1000 个元素可供读取,我将确定性地获得 1000 个元素吗?
    • @Max 没错。这同样适用于不同数据结构上的其他读取操作。
    • @Max 一个小细节,如果您有多个实例(多个副本/哨兵等)等,那么读取可能不一致 - 但情况完全不同。您可以为此搜索 CAP 定理,这是 cmets 中要提及的一个很大的领域。
    • 谢谢。在这种情况下,有一个副本挂在主实例上,但 XREAD 和 XADD 都发生在主实例上。你知道在这种情况下这些操作是否保证是原子的?鉴于您所说的,我怀疑答案是肯定的,但可能存在与同步副本相关的一些延迟?
    • @Max 是的,这就是分布式系统的本质,当您拥有多个实例的集群时,您不能忽略网络或分区容错。您要么具有强一致性(等待所有副本都写入数据),要么具有最终一致性(不要等待所有副本都拥有它)/高可用性。它发生在所有分布式系统中。你放弃了一致性或可用性。 Redis 文档很好地解释了 redis 是如何处理它的。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2020-09-22
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2011-04-11
    相关资源
    最近更新 更多