redis锁分享
共享锁(读锁) LOCK IN SHARE MODE
排他锁(写锁,独占锁,互斥锁)FOR UPDATE
乐观锁和悲观锁
分布式锁:
1.保证多进程(不是多线程了)下数据的正确性
2.效率,一个节点获得锁后执行任务,保证其他节点执行其他任务
分布式锁和本地锁的区别:
分布式锁是进程级别的锁,本地锁是线程级别的锁
分布式锁要存放在redis、zookeeper等公共区域,进程间可见,而本地锁在进程内部的线程间可见
redis分布式锁的实现 - 单机时
1.获取锁:
redis 的 set 指令,设置成功即为获取了锁
setzjw 111 → set zjw 111NX→ set zjw 111EX600 NX
(其实是一条指令,又是单线程,保证了互斥和安全)
2.释放锁:
释放锁之前 ,要先判断该锁是不是自己加的(线程ID),以防误删别人已经新加的锁
为了保证原子性,采用eval命令调用lua脚本
redis分布式锁的实现 - 集群时
存在问题:Master往slave同步锁时候,master crash了,造成锁丢失失效
delay解决方案,延迟重启
Redlock算法:
1.记下开始获取锁的时间。startTime
2.依次向这三台Master发送获取锁的命令。timeout
3.如果获取到超过半数的锁,要记下当前时间。endTime
4.costTime = endTime - startTime,如果costTime<expireTime,则认为获取锁成功
(expireTime尽可能保证业务代码可以执行完,实在不行可以开个守护线程给锁续航)
5.如果获取不到超过一半的锁,或者costTime>=expireTime,都视为获取锁失败
6.如果获取锁失败,需要向全部Master节点,都发生释放锁的命令,也就是那段Lua脚本