• 为什么RedLock并不能100%解决Redis做分布式锁的问题?


    1:首先Redis性能变差了,这和zookeeper一样,多台机器都写成功了,才返回,性能会有下降。写了一部分成功,一部分失败,回滚也会造成性能损失。

    2:加锁,加锁的时候Redis1节点挂了,Redis2和Redis3成功。

    3:如果客户端线程在执行的时候,Redis2实例挂掉了,如果锁没有持久化,那么,那么Redis2的锁也就丢失了。重启后另外一个客户端线程来加锁。

    在Redis1和Redis2加锁成功了,那么这个时候就会有两把一样的锁。

    4:但是大部分情况下,加锁的时候Redis1、Redis2、Redis3都会加锁,所以99.999999999999999999999%的情况RedLock就是可用的。

    5:但是如果你的redis锁是持久化了的,是可以达到100%可用的,其实就是zookeeper了(半数以上)。

    red lock 本身没有思想没有任何问题,但是在cluster模式下会有问题。

    假设一共有5个Redis节点:A, B, C, D, E。设想发生了如下的事件序列:

    1. 客户端1成功锁住了A, B, C,获取锁成功(但D和E没有锁住)。
    2. 节点C崩溃重启了,但客户端1在C上加的锁没有持久化下来,丢失了。
    3. 节点C重启后,客户端2锁住了C, D, E,获取锁成功。

    假设一共有5个Redis节点:A, B, C, D, E。设想发生了如下的事件序列:

    1. 客户端1成功锁住了A, B, C,获取锁成功,也做了持久化(但D和E没有锁住)。
    2. 节点C崩溃重启了,C的slaveC1替代了C作为master,。
    3. 客户端2锁住了C1, D, E,获取锁成功。

     red lock 在cluster模式中使用时,可以将master和slave都作为需要上锁的目标,那么也是没有问题的。

  • 相关阅读:
    Source Maps简介
    JavaScript数据结构——图的实现
    JavaScript数据结构——树的实现
    JavaScript数据结构——字典和散列表的实现
    JavaScript数据结构——集合的实现与应用
    [转]通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题
    安卓刷量技术揭秘
    【转】让Bootstrap 3兼容IE8浏览器
    [LINK]Python服务器开发一:python基础
    [LINK]用Python计算昨天、今天和明天的日期时间
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/14649897.html
Copyright © 2020-2023  润新知