一、分布式加锁过程

RLock lock = redissonClient.getLock(REDISSON_DISTRIBUTE_KEY);
lock.lock();

wireshark抓包可以看见:

*6
$4
EVAL
$336
if (redis.call('exists', KEYS[1]) == 0) then redis.call('hset', KEYS[1], ARGV[2], 1); redis.call('pexpire', KEYS[1], ARGV[1]); return nil; end; if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then redis.call('hincrby', KEYS[1], ARGV[2], 1); redis.call('pexpire', KEYS[1], ARGV[1]); return nil; end; return redis.call('pttl', KEYS[1]);
$1
1
$30
cache.redisson.distribute.lock
$5
30000
$40
b56fb34c-e1b7-400f-a635-ad6881f75c7b:110

整理后,如下:

// 如果key不存在,则调用hashset去设置,并设置过期时间
if (redis.call('exists', cache.redisson.distribute.lock) == 0)
then redis.call('hset', cache.redisson.distribute.lock, b56fb34c-e1b7-400f-a635-ad6881f75c7b:110, 1);
redis.call('pexpire', cache.redisson.distribute.lock,30000);
return nil;
end;

//key已经存在的情况下,直接incrby,然后设置过期时间
if (redis.call('hexists', cache.redisson.distribute.lock, b56fb34c-e1b7-400f-a635-ad6881f75c7b:110) == 1) then
redis.call('hincrby', cache.redisson.distribute.lock, b56fb34c-e1b7-400f-a635-ad6881f75c7b:110, 1);
redis.call('pexpire', cache.redisson.distribute.lock, 30000);
return nil;
end; return redis.call('pttl', cache.redisson.distribute.lock);

二、redisson 解锁过程

整理后,脚本如下:

if (redis.call('hexists', cache.redisson.distribute.lock, e16193b0-e25c-4563-bc6e-19cc88d6112a:105) == 0) then
return nil;
end;

// -1操作
local counter = redis.call('hincrby', cache.redisson.distribute.lock, e16193b0-e25c-4563-bc6e-19cc88d6112a:105, -1);
if (counter > 0) then
// 延长过期时间
redis.call('pexpire', cache.redisson.distribute.lock, 30000);
return 0;
else
// 删除分布式锁的key,发布消息
redis.call('del', cache.redisson.distribute.lock);
redis.call('publish', redisson_lock__channel:{cache.redisson.distribute.lock}, 0);
return 1;
end;
return nil;

https://my.oschina.net/u/2369201/blog/1573730

三、续期原理

可参考:https://juejin.im/post/5d122f516fb9a07ed911d08c


验证时,如下图,在过了20s后,(程序在sleep),开始续期:

看看续期包的内容:

可以看到,续了30s。然后因为我们睡眠了1分钟,所以接下来又触发了续期:

Redisson 加锁原理的更多相关文章

  1. MySQL的死锁系列- 锁的类型以及加锁原理

    疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发现了死锁现象: ERROR 1213 (40001): De ...

  2. 【Java】【JVM】Sychronized底层加锁原理详解

    我们首先先看看JMM模型,话不多说,上图: JMM对应的8大原子操作: read(读取):从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 ...

  3. 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

    昨晚我正在床上睡得着着的,突然来了一条短信. 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志. 能清楚看到是这条insert语句发生了死锁. MySQL如果检测到两个事务发生了死锁,会回滚 ...

  4. 【分布式锁】01-使用Redisson实现可重入分布式锁原理

    前言 主流的分布式锁一般有三种实现方式: 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 之前我在博客上写过关于mysql和redis实现分布式锁的具体方案:https:// ...

  5. 【分布式锁】03-使用Redisson实现RedLock原理

    前言 前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的. RedLock原理 RedLock是基于redis实现的分布式锁,它能够保证以 ...

  6. Redisson 实现分布式锁的原理分析

    写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题.​ 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁, ...

  7. Redisson 实现分布式锁原理分析

    Redisson 实现分布式锁原理分析   写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题.​ 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有 ...

  8. 又长又细,万字长文带你解读Redisson分布式锁的源码

    前言 上一篇文章写了Redis分布式锁的原理和缺陷,觉得有些不过瘾,只是简单的介绍了下Redisson这个框架,具体的原理什么的还没说过呢.趁年前项目忙的差不多了,反正闲着也是闲着,不如把Rediss ...

  9. 分布式锁中的王者方案-Redisson

    上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson. 缓存系列文章: 缓存实战(一):20 图 |6 千字|缓存实战(上篇) 缓存实战(二):R ...

随机推荐

  1. JUC之Java中的阻塞队列及其实现原理

    在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...

  2. 什么是ETCD及其应用场景

    ​ 源自公众号:BiggerBoy 一.什么是etcd? etcd 发音为/ˈɛtsiːdiː/,名字的由来,"distributed etc directory.",意思是&qu ...

  3. 数据库delete from和truncate删除的区别详解

    一:区别 1.delete from 后面可以直接接条件,truncate不可以 2.delete from 记录是一条条删除的,所删除的每行记录都会进入日志,而truncate一次性删除整个页,因此 ...

  4. 使用工具john破解系统密码

    下载解压得到一个存在着hash值的passwd的文件,还有一个压缩包解压得到的是一个密码本,应该就是需要使用爆破的密码本了 放在kali里面,根据题目的要求,将root的hash复制下来然后输入到一个 ...

  5. Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】

    一.前言 我们在实现使用Redis实现分布式锁,最开始一般使用SET resource-name anystring NX EX max-lock-time进行加锁,使用Lua脚本保证原子性进行实现释 ...

  6. 自定义表链 SnakList

    两种方式实现表链:第二种性能差 using System; using System.Collections; namespace Galaxy { class Program { static vo ...

  7. Kubernetes集群搭建(详细)

    kubernetes集群搭建(kubeadm方式) kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创 ...

  8. vue+element ui后台遇到的坑

    今天在用elementui做后台系统,遇到第一个坑:分页显示的是英文 按照官网组件复制下来的代码: <el-row :gutter="0" style="margi ...

  9. 使用PLSQL 创建Oracle数据库用户并设置权限

    转至https://blog.csdn.net/ying890/article/details/14083029?utm_medium=distribute.pc_relevant_download. ...

  10. 【译】C# 11 特性的早期预览

    原文 | Kathleen 翻译 | 郑子铭 Visual Studio 17.1(Visual Studio 2022 Update 1)和 .NET SDK 6.0.200 包含 C# 11 的预 ...