Redisson 加锁原理
一、分布式加锁过程
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 加锁原理的更多相关文章
- MySQL的死锁系列- 锁的类型以及加锁原理
疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发现了死锁现象: ERROR 1213 (40001): De ...
- 【Java】【JVM】Sychronized底层加锁原理详解
我们首先先看看JMM模型,话不多说,上图: JMM对应的8大原子操作: read(读取):从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 ...
- 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理
昨晚我正在床上睡得着着的,突然来了一条短信. 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志. 能清楚看到是这条insert语句发生了死锁. MySQL如果检测到两个事务发生了死锁,会回滚 ...
- 【分布式锁】01-使用Redisson实现可重入分布式锁原理
前言 主流的分布式锁一般有三种实现方式: 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 之前我在博客上写过关于mysql和redis实现分布式锁的具体方案:https:// ...
- 【分布式锁】03-使用Redisson实现RedLock原理
前言 前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的. RedLock原理 RedLock是基于redis实现的分布式锁,它能够保证以 ...
- Redisson 实现分布式锁的原理分析
写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题. 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁, ...
- Redisson 实现分布式锁原理分析
Redisson 实现分布式锁原理分析 写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题. 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有 ...
- 又长又细,万字长文带你解读Redisson分布式锁的源码
前言 上一篇文章写了Redis分布式锁的原理和缺陷,觉得有些不过瘾,只是简单的介绍了下Redisson这个框架,具体的原理什么的还没说过呢.趁年前项目忙的差不多了,反正闲着也是闲着,不如把Rediss ...
- 分布式锁中的王者方案-Redisson
上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson. 缓存系列文章: 缓存实战(一):20 图 |6 千字|缓存实战(上篇) 缓存实战(二):R ...
随机推荐
- 了解MySQL存储引擎工作原理
MySql数据库最大的特色就是其插件式的存储引擎架构,本文主要介绍MySql常用的存储引擎,为开发时选择合适的存储引擎提供参考. 1. MySql体系结构# 在介绍存储引擎之前先来介绍下MySql的体 ...
- 力扣第二题 大数相加 ,链表在python到底该怎么写?
但问题在于链表的表示 如何创建一个L3呢 如何用next将他们连接起来呢? 原来是采用 制作链表的形式 l3_pointer.next = ListNode(l1_pointer.val + l2_ ...
- 移动BI应该怎么规划?每一个数据产品经理必看
在移动化.大数据浪潮的今天,基于数据做决策应该是每一家公司的标配:每家公司都有专门负责数据的人,也都应该有一个BI部门. 而移动BI,基于手机端随时随地进行数据查询和分析--更是BI中不可或缺的一部分 ...
- 国产BI报表工具中低调的优秀“模范生”——思迈特软件Smartbi
首先简单来介绍一下这位低调且优秀的模范生--思迈特软件Smartbi.思迈特Smartbi是企业级商业智能BI和大数据分析品牌,满足用户在企业级报表.数据可视化分析.自助分析平台.数据挖掘建模.AI智 ...
- C++ string 常用函数总结
头文件:#include<string> [注]:文中关于个数的参数文档中为 size_type 型,更本质是 size_t 型,因为typedef size_t size_type,而 ...
- linux中at命令详解
转至:https://blog.51cto.com/12822117/2121101 at命令: 一:简介: 计划任务,在特定的时间执行某项工作,在特定的时间执行一次,需要安装at服务,apt-get ...
- 使用PLSQL 创建Oracle数据库用户并设置权限
转至https://blog.csdn.net/ying890/article/details/14083029?utm_medium=distribute.pc_relevant_download. ...
- Centos Linux下载rpm软件包(基础环境篇)-从零到无
--时间:2020年10月23日 --作者:飞翔的小胖猪 一.概述 1.1 前言 很多生产环境往往是独立的一张网络不与互联网相通,经常会出现的问题就是应用在部署的时候无法安装配套的依赖包.导致很简单 ...
- 无法cin一个string 没有找到接受“std::string”类型的右操作数的运算符(或没有可接受的转换)
头文件#include<string>不能写成#include<string.h>
- c语言 排序(转)
https://blog.csdn.net/Galaxy_n/article/details/116742537