【问题标题】:Locking and Redis锁定和 Redis
【发布时间】:2012-05-25 21:16:31
【问题描述】:

我们有 75 台(并且还在不断增加)服务器需要通过 Redis 共享数据。理想情况下,所有 75 台服务器都希望使用 INCRBYFLOAT 操作写入 Redis 中的两个字段。我们预计最终在这两个字段上可能会有数百万的每日写入操作和 十亿 的每日读取。此数据必须是持久的。

我们担心 Redis 锁定可能会导致多次重试写入操作,同时多次尝试增加同一字段。

问题:

  • 在负载非常重的情况下,单个字段上的多个同时 INCRBYFLOAT 是不是一个坏主意?
  • 我们是否应该有一个外部进程“汇总”单独的字段并改为写入这两个字段? (这引入了另一个故障点)
  • 在写入时读取这两个字段会阻塞吗?

【问题讨论】:

    标签: locking redis scalability


    【解决方案1】:

    Redis 不锁定。此外,它是单线程的;所以没有竞争条件。读取或写入不会阻塞。

    您可以在同一个密钥上运行数百万个INCRBYFLOAT 而不会出现任何问题。无需外部流程。读取这些字段不会造成任何问题。

    也就是说,“两个键的数百万次更新”听起来很奇怪。如果你能解释你的用例,也许有更好的方法在 Redis 中处理它。

    【讨论】:

    • 75 台服务器将在每天可能进行的数十亿次拍卖中出价。对于我们赢得的拍卖(可能每天数百万),我们需要写出每天和总花费的金额。我们不得超过我们的每日或总支出金额。这意味着,对于我们数十亿次的拍卖,我们需要阅读每日和总金额,如果超过则停止竞标。因此,每天有数十亿次读取,每天可能有数百万次写入。
    • 您声称读写不会阻塞。 blinkov 声称写入通常会阻止读取。我如何验证你们谁是正确的?
    • Sri 是正确的 - Redis 实例是单线程的,因此所有内容都是序列化的(读取或写入操作)。不需要锁。请参阅 redis.io/topics/benchmarks 并运行您自己的基准测试以评估性能是否适合您。
    【解决方案2】:

    由于 Redis 是单线程的,您可能希望使用主从复制将写入和读取分开,因为是的,写入通常会阻塞读取。

    您也可以考虑为此使用Apache Zookeeper,它提供可靠的集群协调,没有单点故障(如单个 Redis 实例)。

    【讨论】:

    • 现在我很困惑。下面,Sripathi 声称读写不会阻塞。您声称该写入通常会阻止读取。我如何验证你们谁是正确的?
    • 实际上写操作并没有真正阻塞读操作。一切都是序列化的。不过,使用 Zookeeper 来避免单点故障并不是一个坏建议。但是吞吐量不会一样(Redis 效率更高)。
    • 我的意思是,由于它是单线程模型,Redis 实例在任何时候都无法同时处理两个或多个请求,无论它们是读取还是写入。并且由于问题表明读取比写入多得多,因此将读取负载分配给从属设备是合乎逻辑的。
    猜你喜欢
    • 2017-02-05
    • 2020-07-01
    • 2016-05-22
    • 2018-10-07
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多