Redisson实现分布式锁

目录

  • 工作原理
  • lua脚本
  • 加锁与锁互斥
  • watch dog自动延期机制
  • 可重入锁机制
  • 释放锁机制
  • 代码

工作原理

Redisson实现分布式锁_第1张图片

lua脚本

现在某个客户端要加锁,且该客户端面对是redis cluster集群。
它会首先根据hash节点选择一台机器,紧接着会发送一端lua脚本到redis上。

lua脚本可以保证代码执行的原子性
Redisson实现分布式锁_第2张图片

加锁与锁互斥

加锁:

在这里插入图片描述

  • KEYS[1] 代表加锁的key名称。
  • 如:
    key
  • ARGV[1]代表key的默认生产时间,默认为30s
  • ARGV[1]代表加锁的客户端id,类似于下面的字符串

在这里插入图片描述
代码解析:

  • 第一个if来判断要加锁的key是否存在,如果不存在,就使用hset进行key value的加锁

  • 在这里插入图片描述

  • 数据结构为下图:

  • Redisson实现分布式锁_第3张图片

  • 接着会执行pexpire mylock 30000命令,设置mylock的锁的生存时间是30s

锁互斥:

  • 如果客户端1拿到了锁,客户端2尝试加锁,执行了同样的lua脚本
  • 那么第一个if判断会执行exists mylock,发现mylock这个锁key已经存在了。
  • 会走第二个if判断,mylock锁key的hash数据结构中,没有包含客户端2的id,那么客户端2会获得pttl mylock返回的一个数字,这个数字代表mylock这个锁key的剩余生产时间,比如15000毫秒。
  • 此时客户端2会进行一个不停尝试加锁的while循环中。

watch dog自动延期机制

  • 客户端1加锁的key默认生存时间是30s。一旦客户端1加锁成功,就会启动一个watch dog,它是一个后台线程会每隔10s检查一下,如果客户端1还持有锁key,那么久会不断延长锁key的生存时间。

可重入锁机制

  • 如果客户端1已经加锁了,可重入锁首先会进行第一个if判断不成立,第二个if判断会调用+1的逻辑。

  • 在这里插入图片描述

  • mylock的数据结构变成下图的样子,2代表加锁的次数

  • Redisson实现分布式锁_第4张图片

释放锁机制

  • 执行lock.unlock() 就可以释放分布式锁。
  • 如果发现加锁次数是0就说明这个客户端不再持有锁了。此时用del mylock命令删除key即可。
  • 此时客户端2就可以尝试完成加锁了。

代码

引入依赖:
Redisson实现分布式锁_第5张图片
注入bean
Redisson实现分布式锁_第6张图片

使用:

Redisson实现分布式锁_第7张图片

你可能感兴趣的:(⭐【Redis】,Redisson实现分布式锁,lua脚本,watch,dog自动延期,可重入锁,释放锁)