分布式锁的一些理解
分布式锁,属于分布式系统,是一种跨进程的跨机器节点的互斥锁,它可以用来保证多机器节点对于共享资源访问的排他性。
分布式锁的锁定为多进程多机器节点
满足特性:
1.排他性:同一时刻只能有一个节点去访问资源
2.可重入性:允许获得锁的进程,可以在没有释放锁之前再次重新获得锁
3.超时释放:防止程序执行异常等,无法释放,导致死锁
4.安全性:只能被持有的删除,不能被其他客户端删除(例如redis+随机数实现)
分布式锁的设计方式:
1. redis分布式锁
Redis,SETNX 命令可以实现锁的排他性,当key 不存在就返回1,
存在就返回0。然后还可以用expire 命令设置锁的失效时间,从而避免死锁问题。
当然有可能存在锁过期了,但是业务逻辑还没执行完的情况。所以这种情况,可以写
一个定时任务对指定的key 进行续期。
Redisson 这个开源组件,就提供了分布式锁的封装实现,并且也内置了一个Watch
Dog 机制来对key 做续期。
2.数据库实现分布式锁
2.1 创建一张锁表,记录锁定的方法名和时间,并对锁的key添加唯一性约束,此处是方法名
(id,methodName,methodDesc) 设置methodName为唯一约束unique
优点:利用数据库,容易理解
缺点:1.单点问题:数据库要搭建成集群形式,防止单点故障
2.释放问题:新增定时任务扫描,清理过期数据
3.重入性,新增字段记录当前线程信息或者生成一个随机数存入,下次线程来的时候带着随机数查询
2.2 数据库排他锁
for update
数据范围要足够小,保证可以走行锁
2.3 数据库乐观锁
新增version字段,生成uuid存储,每次更新数据时候加上版本号码作为判断
3.zookeepeer实现
zk存储类似Windows文件系统,区别在于Windows目录不能存储数据,文件才能存储,zk是都可以存储的!
3.1 节点类型
1.临时节点:随着客户端会话结束或者程序结束失效
2.永久节点:程序结束会话,客户端结束并不会失效
3.临时有序节点:临时的节点,但是按照序列排序,比如创建10节点,从1-10排序
4.持久有序节点:同永久节点,只是是有序的
原理:多个客户端创建自己的节点,按照排序获取锁
A先获取到锁,B获取的时候发现有比它小的节点,监听前面的客户端什么时候释放锁
释放锁:
A执行完释放,B监听,获取锁成功,以此类推
参考资料:
https://mp.weixin.qq.com/s/i7PJJ8aumb-1VAGNTYYdtw