NodeJS 基于redis的分布式锁的实现(Redlock算法)

1. 前言

开发时,碰到互斥问题,需要保证在分布式环境下,避免重复性操作修改用户状态,如:用户订单状态,购票时,修改票的余额等

2. 分布式锁的条件
  • 分布式锁需要满足下列条件
    • 锁需要有充足的可访问的存储空间
    • 锁必须被唯一标识
    • 锁至少要有两种状态
  • 同时,要保证
    • 安全特性:互斥访问,永远只有一个client能拿到锁
    • 避免死锁:client最后可以拿到锁,不会出现死锁,即使原本上锁的client出现问题无法解锁
    • 容错性:容错,只要大多数redis节点能够正常工作,客户端端都能获取和释放锁。
3.Redis单节点上锁的实现
  • 使用下列语句获取一个不存在的key,如果可以已存在则创建失败,确保key值唯一, 加上过期时间,确保系统错误后及时解锁,避免死锁
 SET key value NX PX 30000

但是这种方法在主库错误时,会发生错误,redis主从同步是异步,主库错误时,从库若还没有锁的信息,则会导致多个进程持有锁

3. Redlock算法(官方文档

在分布式版本的算法里我们假设我们有N个Redis master节点,这些节点都是完全独立的,我们不用任何复制或者其他隐含的分布式协调算法。我们已经描述了如何在单节点环境下安全地获取和释放锁。因此我们理所当然地应当用这个方法在每个单节点里来获取和释放锁。在我们的例子里面我们把N设成5,这个数字是一个相对比较合理的数值,因此我们需要在不同的计算机或者虚拟机上运行5个master节点来保证他们大多数情况下都不会同时宕机。一个客户端需要做如下操作来获取锁:

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值