09_Redlock算法和底层源码分析

Redlock算法和底层源码分析

一、当前代码为8.0版接上一步

自研分布式锁的重点:

  1. 按照juc里面Lock接口规范进行编写
  2. lock加锁关键逻辑
    1. 加锁:在redis中,加锁实际上是给key设置一个值,为避免死锁,并给key一个过期时间
    2. 自旋
    3. 续期
  3. unlock解锁关键逻辑
    1. 将redis中的key删除。但是不能乱删,加锁与解锁必须是同一把锁。

二、Redis分布式锁-Redlock红锁 Distributed locks with Redis

  1. 官网说明

    https://redis.io/docs/manual/patterns/distributed-locks/

  2. 为什么学这个?怎么产生的?

  3. RedLock算法设计理念?

    Redis也提供了RedLock算法,用来实现基于多个实例的分布式锁。

    锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。

    Redlock算法是实现高可靠分布式锁的一种有效解决方案,可以在实际开发中使用。

    09_Redlock算法和底层源码分析_第1张图片

    设计理念

    该方案为了解决数据不一致的问题,直接舍弃了异步复制只使用master节点,同时由于舍弃了slave,为了保证可用性,引入N个节点,官方建议是5.

    客户端只有在满足下面这两个条件时,才能认为是加锁成功:

    1. 客户端从超过半数(大于等于N/2+1)的Redis实例上成功获取到锁。
    2. 客户端获取锁的总耗时没有超过锁的有效时间。

    解决方案:

    09_Redlock算法和底层源码分析_第2张图片

  4. RedLock落地实现?

    Redisson是Java的redis客户端之一,提供了一些api方便操作

    Redisson官网:https://redisson.org

    redisson github :https://github.com/redisson/redisson

    redisson分布式锁:https://github.com/redisson/redisson/wiki/8.-%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E5%92%8C%E5%90%8C%E6%AD%A5%E5%99%A8#84-%E7%BA%A2%E9%94%81redlock

    redisson可能存在的bug

    在解锁的时候,需要判断当前是锁定状态,并且锁是当前线程持有的。

三、使用Redisson进行编码改造V9.0

四、Redisson源码解析

最低保证分布式锁有效性和安全性的要求:

  1. 互斥:任何时刻只能有一个client获取锁
  2. 释放死锁:即使锁定资源的服务崩溃或者分区,仍然能释放锁
  3. 容错性:只要多数redis节点(一半以上)在使用,client就可以获取和释放锁。

你可能感兴趣的:(redis,redis)