简单地说,我们现在是Redis

了解更多

复述,最佳实践

Redlock

在系统中,有时必须锁定资源。这可能是做出不能以任何并发方式解决的关键修改。锁的目标是:

  • 一个工人(而且只有一个人)努力工作以获得对某一资源的权利
  • 能够可靠地释放这个锁
  • 不死锁任何资源意味着资源应该在给定时间后解锁。

Redis是一个很好的锁定选项,因为它有一个简单的基于密钥的数据模型,每个分片都是单线程的,而且非常快。使用Redis的锁定有一个完善的、规范的实现叫做Redlock。

Redlock客户是可用的在几乎所有使用的语言中,所以重新发明轮子是没有关系的。然而,重要的是要了解Redlock是如何工作的,以便能够安全有效地使用它。

首先,重要的是要理解Redlock被设计为至少在3台具有独立Redis实例的机器上运行。这避免了锁定机制中的任何单点故障(这将导致所有资源的死锁!)另一点理解,而时钟同步不需要100%,时钟需要时间以同样的方式——例如函数以同样的速度移动,1秒机器对机器B等于1秒。

用Redlock设置锁首先要获得毫秒级精度的时间戳,你还必须有一个预先确定的锁时间。然后通过设置一个随机值的键(只在键不存在的情况下)并在键上设置一个超时来放置锁。对于序列中每个独立的实例都重复此操作。如果一个实例关闭了,那么立即继续。如果在给定超时之前成功地在大多数实例中设置了锁,那么就会获得锁。如果没有及时获得,则不会获得锁。操作或更新锁的锁定时间是实现锁定所需的时间减去预定的总锁定时间。在失败或超时的情况下,解锁所有实例并再次尝试。

为了释放锁,使用了一个Lua脚本来检查键集是否具有预期的随机值。如果是,那么您可以删除密钥,如果不是,那么就不要管它,因为它可能是一个新的锁。

Redlock过程提供了良好的保证,并且没有单点故障,因此您可以高度相信单锁将被分配出去,并且不会发生死锁。

还看到:

Baidu