redis锁分享

2019-04-23  本文已影响0人  麦迪归来

共享锁(读锁) 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脚本

上一篇下一篇

猜你喜欢

热点阅读