锁定和Redis

Ovi*_*vid 10 scalability locking redis

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

我们担心Redis锁定可能导致重复重写写操作,同时尝试增加同一个字段.

问题:

  • INCRBYFLOAT在一个非常重的负载下,单个字段上的多个同时是一个坏主意吗?
  • 我们是否应该让外部流程"汇总"单独的字段并写入两个字段?(这引入了另一个失败点)
  • 这两个字段的读取会在写入时阻塞吗?

Sri*_*nan 15

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

您可以INCRBYFLOAT毫无问题地在同一个密钥上运行数百万个.无需外部流程.阅读这些字段不会造成任何问题.

也就是说,"对两把钥匙的数百万次更新"听起来很奇怪.如果您可以解释您的用例,也许在Redis中可能有更好的方法来处理它.

  • Sri是正确的 - Redis实例是单线程的,所以一切都是序列化的(读或写操作).无需锁定.请参阅http://redis.io/topics/benchmarks并运行您自己的基准测试,以评估性能是否适合您. (3认同)

Iva*_*kov 5

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

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

  • 我的意思是因为它在任何时刻都是单线程模型,Redis实例不能同时处理两个或多个请求,无论它们是读还是写.而且由于问题表明将会有比读写更多的读取,因此将读取负载分配给从站是合乎逻辑的. (6认同)