正确的Redis分布式锁实现(Distributed lock)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正确的Redis分布式锁实现(Distributed lock)相关的知识,希望对你有一定的参考价值。

参考技术A 锁要实现的三个目标:

该命令仅在密钥尚不存在时才设置key(NX选项),到期时间为30000毫秒(PX选项)。键设置为值 “myrandomvalue” 。此值必须在所有客户端和所有锁定请求中都是唯一的。

使用随机值是为了以安全的方式释放锁,实现上使用了Redis的脚本:只有当key存在且其值恰好是我期望的随机值时才删除key。这是通过以下Lua脚本完成的:

这一点很重要,这可以避免删除由另一个客户端创建的锁。例如:

ok,这样我们完成redis分布式锁的实现。你以为这样就安全了吗,接下来我们设想这样一个情况:

首先,假设我们的Redis是主从的:

这时就会同时有两把锁存在的情况。对于这种情况(非常特殊),Redis官方提供了一个叫RedLock的解决方案。

我们假设我们有N个Redis主机。这些节点完全独立,因此我们不使用复制或任何其他隐式协调系统。我们假设N = 5,这是一个合理的值,因此我们需要在不同的计算机或虚拟机上运行5个Redis主服务器,以确保它们以大多数独立的方式失败。

为了获取锁,客户端执行以下操作:

我个人觉得对于小公司这还是相当昂贵的。

其他的细节请参考 redis官方文档 。

以上是关于正确的Redis分布式锁实现(Distributed lock)的主要内容,如果未能解决你的问题,请参考以下文章

Redis分布式锁的正确实现方式

Redis分布式锁的正确实现方式

Redis分布式锁的正确实现方式

Redis分布式锁的正确实现方式

redis分布式锁的正确实现方式

Redis分布式锁的正确实现方式