别再错误的使用分布式锁了

Posted Lindbergh_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了别再错误的使用分布式锁了相关的知识,希望对你有一定的参考价值。

分布式锁

1. Zookeeper 实现分布式锁

zookeeper 主要解决分布式数据的一致性问题

1.1 zookeeper 节点类型

  • 临时节点
    • 程序执行完或者程序出现异常或者会话结束了,临时节点就会消失
  • 临时有序节点
    • 临时节点有序的排列
  • 持久节点
    • 不论是程序执行完或者程序出现异常或者会话结束了,节点都不会消失
  • 持久有序节点
    • 持久且有序的节点

1.2 zookeeper 的事务监听 watch

主要监听:

  • 节点创建
  • 节点删除
  • 节点数据修改
  • 子节点变更

1.3 错误的分布式锁

多个客户端去争夺创建一个临时节点(临时节点是唯一的)

当客户端很多的时候,同时去竞争一把锁,对zookeeper还是对系统都是一个压力。

惊群现象或者叫羊群效益,所以是错误的

1.4 正确的分布式锁

临时有序节点实现

使用临时有序节点对请求进行一个排队,并且每个节点都只会监听在自己前面的那一个节点,只有当前面的节点释放,他才回去获取锁。

解决了惊群现象,达到的效果就是,同一时间只有一个客户端在竞争这个锁

1.5 zookeeper锁的种类

  • 分布式可重入共享锁
  • 分布式排它锁
  • 分布式读写锁
  • 用多个锁进行一组操作
  • 共享信号量

2. Redis 分布式锁

2.1 分布式锁几大特性

  • 互斥性。在任意时刻,只有一个客户端能持有锁,也叫唯一性。

  • 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。

  • 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁。

  • 锁不能自己失效。正常执行程序过程中,锁不能因为某些原因失效。

  • 具有容错性。只要大多数Redis节点正常运行,客户端就能够获取和释放锁。

2.2 正确的分布式锁实现

2.2.1 redis分布式锁加锁流程

2.2.2 锁不能自己失效 的实现原理

可能会造成长时间占用锁

所以使用的前提:没有设置持有锁的时间

定时的判断这个锁的实效实现,如果判断这个锁快要失效了,就去延长这个锁的失效时间,从而实现哪怕我执行的时间久一点,也不会因为设置的过期时间到了而被删除

2.2.3 redis分布式锁解锁流程

以上是关于别再错误的使用分布式锁了的主要内容,如果未能解决你的问题,请参考以下文章

别再错误的使用分布式锁了

别再错误的使用分布式锁了

加锁了,还有并发问题?Redis分布式锁你真的了解?

区块链和分布式账本的概念,韭菜们别再搞混了?6月29日前瞻分析

别再用MongoDB了!

别再埋头 CRUD 了,Seata 真香!