分布式锁
MYSQL实现
- 创建一个锁表, 表头资源ID,锁状态,节点ID
- 当一个节点处理请求时 先根据资源ID判断资源是否上锁,等待锁被释放后创建一条锁记录,进行后续操作.
缺点:
- 因为MYSQL是文件IO效率会慢
REDIS实现
- 通过setnx来设置锁,如果返回1代表获取锁,0就继续等待
问题:
- 可能会出现死锁,假如程序异常导致锁没有正常释放就会出现死锁; 解决方法就是设置一个过期时间,这样就算程序崩溃锁也会被回收.
- 设置过期会引发新的问题,假如过期的时间内业务没有执行完,这时候锁会被提前释放,这时候有下个进程的话会进来设置一个新锁,前一个进程业务执行完以后又会把锁给释放掉,程序就乱了; 解决这两个问题的方法就是在value里面保存进程信息, 获取锁的时候触发一个进程任务每半个过期时间判断一下进程是否执行完了,没执行完就给锁续一下期,还有就是释放锁的时候判断一下是否是进程自己的锁.
相比MYSQL,REDIS基于内存性能会好很多
使用分段锁可以提升性能
分段锁是把资源ID分成多个段,对应的锁就会有多把,能增加并发量
Zookeeper实现
基本概念:
- 顺序节点: 每个节点和zookeeper连接的时候zk会按顺序创建一个节点的lock文件
- 临时节点: 当节点和zk断开的时候会删掉这个文件
所以每个进程可以通过判断lock文件的编号是不是最小的,如果是就能获取锁,否则就等着.
标签:释放,过期,节点,MYSQL,进程,ID,分布式 From: https://www.cnblogs.com/houjiaqi/p/18326010