美文网首页
redis锁分享

redis锁分享

作者: 麦迪归来 | 来源:发表于2019-04-23 14:14 被阅读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脚本

    相关文章

      网友评论

          本文标题:redis锁分享

          本文链接:https://www.haomeiwen.com/subject/xosvgqtx.html