Redisson 分布式锁原理分析

Redisson 分布式锁原理分析

示例程序

示例程序:

public class RedissonTest {
    public static void main(String[] args) {

        Config config = new Config();
        config.useSingleServer()
                .setPassword("123456")
                .setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);
        // RLock对象
        RLock lock = redisson.getLock("MY_KEY");

        ExecutorService pool = Executors.newFixedThreadPool(5);
        IntStream.range(1, 5).forEach(item -> {
            pool.execute(() -> {
                try {
                    if (lock.tryLock(2000, TimeUnit.MILLISECONDS)) {
                        System.out.println(Thread.currentThread().getName() + "get Lock!!");
                        if (lock.tryLock(2000, TimeUnit.MILLISECONDS)) {
                            System.out.println(Thread.currentThread().getName() + "get Lock!!");
                            Thread.sleep(300000);
                            lock.unlock();
                        }
                        Thread.sleep(500000);
                        lock.unlock();
                    }
                } catch (Exception e) {
                    System.out.println("error!!");
                }
            });
        });

    }
}

运行结果:
image.png

redis中的值:
image.png

原理

分布式锁实现加锁解锁都需要使用lua脚本。
利用Redis的Hash结构实现可重入。

Hash结构存值如下:

key field value
  • key:就是分布式锁的key
  • field:用于存储一个能够表示一个线程的唯一标识(Redisson使用的UUID)
  • value:表示当前锁被同一个线程加锁的次数(可重入的实现方式)

下面以key为MY_KEY,field线程唯一标识为:WWSSWWWKKII99I为例,总结下加锁解锁流程:

加锁流程

加锁流程:

加锁之后,hash结构为

key field value
MY_KEY WWSSWWWKKII99I 1

实际的存储示例:
一个线程获取了一次:
image.png
一个线程获取了两次(可重入):
image.png

解锁流程

解锁流程:
假设当前锁的hash结构是

key field value
MY_KEY WWSSWWWKKII99I 2

这代表分布式锁 MY_KEY 被线程标识为 WWSSWWWKKII99I 的线程获取了两次

需要注意,整个加锁解锁的命令全都需要使用lua脚本。这样能保证操作的原子性。

相关推荐

  1. Redis - 分布式Redisson

    2024-03-16 20:22:01       54 阅读
  2. SpringBoot+Redisson分布式

    2024-03-16 20:22:01       45 阅读
  3. SpringBoot+Redisson分布式

    2024-03-16 20:22:01       61 阅读
  4. Redisson分布式

    2024-03-16 20:22:01       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 20:22:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 20:22:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 20:22:01       82 阅读
  4. Python语言-面向对象

    2024-03-16 20:22:01       91 阅读

热门阅读

  1. rocketMQ的基本认识

    2024-03-16 20:22:01       38 阅读
  2. 防抖&节流 原理及手写方法

    2024-03-16 20:22:01       46 阅读
  3. 小程序初步

    2024-03-16 20:22:01       35 阅读
  4. wordpress常用代替插件的代码

    2024-03-16 20:22:01       35 阅读
  5. git修改push过的commit信息及用户名和邮箱

    2024-03-16 20:22:01       39 阅读
  6. HarmonyOS ArkTS 渲染控制概述 if/else:条件渲染

    2024-03-16 20:22:01       47 阅读
  7. 二维数组_计算矩阵边缘元素之和

    2024-03-16 20:22:01       41 阅读
  8. Stealing Part of a Production Language Model

    2024-03-16 20:22:01       48 阅读