Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

2021-07-15
阅读 2 分钟
2.1k
前言Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch。Semaphore意思就是在分布式场景下,只有 3 个凭证,也就意味着同时只会有三个线程执行业务。设置凭证参数列表:KEYS[1]:指定的 key 这里叫 semaphoreKEYS[2]:redisson_sc:{semaphore}ARGV[1]:凭证数 3这块 lua 脚本相对简...

Redisson 分布式锁源码 10:读写锁

2021-07-13
阅读 3 分钟
3.1k
前言Redisson 还支持可重入读写锁,允许在分布式场景下,同时有多个读锁和一个写锁处于加锁状态。使用读写锁Redisson 读写锁实现了 JUC 下的 ReadWriteLock,使用方式基本相同。源码加锁源码基本和之前的可重入锁加锁无区别,唯一的差异就是在 Lua 脚本这里。所以下面着重分析 Lua 脚本。读锁源码源码地址:org.redisson...

Redisson 分布式锁源码 09:RedLock 红锁的故事

2021-07-12
阅读 4 分钟
4.9k
所以本文会先介绍什么是 RedLock,当大家对 RedLock 有一个基本的了解。然后再看 Redisson 中是如何实现 RedLock 的。

Redisson 分布式锁源码 08:MultiLock 加锁与锁释放

2021-07-10
阅读 2 分钟
2.9k
基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的 Redisson 实例。

Redisson 分布式锁源码 07:公平锁释放

2021-07-09
阅读 1 分钟
2k
看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,这块公平锁和非公平锁并无区别。

Redisson 分布式锁源码 06:公平锁排队加锁

2021-07-08
阅读 2 分钟
3.6k
Redis Hash 数据结构:存放当前锁,Redis Key 就是锁,Hash 的 field 是加锁线程,Hash 的 value 是 重入次数;

Redisson 分布式锁源码 05:公平锁加锁

2021-07-07
阅读 4 分钟
1.9k
前言默认的加锁逻辑是非公平的。在加锁失败时,线程会进入 while 循环,一直尝试获得锁,这时候是多线程进行竞争。就是说谁抢到就是谁的。Redisson 提供了 公平锁 机制,使用方式如下: {代码...} 下面一起看下公平锁是如何实现的?公平锁相信小伙伴们看过前面的文章,已经轻车熟路了,直接定位到源码方法:RedissonFair...

Redisson 分布式锁源码 04:可重入锁释放

2021-07-06
阅读 1 分钟
1.8k
前言前面已经了解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。当锁加锁成功之后,锁是如何释放的?主动释放源码入口:RedissonLock#unlock在解锁时会获取当前线程的id。一路往里跟,直接来到 RedissonLock#unlockInnerAsync:分析一下 lua 脚本的内容:如果锁不存在,直接返回 null;如果锁存在,则对锁的重入次数 -1...

Redisson 分布式锁源码 03:可重入锁互斥

2021-07-05
阅读 1 分钟
2k
前言看过可重入锁的 Lua 脚本,已经可以知道当锁存在时,是会加锁失败的。下面看一下,加锁失败之后是如何处理的呢?加锁 Lua 脚本在 lua 脚本中,前两段 if 分别排除了两种情况:锁不存在;锁存在且是自己线程(可重入);剩下的情况就是锁存在,但是不是自己,也就意味着加锁失败。执行 pttl 命令,返回锁的剩余时间。...

Redisson 分布式锁源码 02:看门狗

2021-07-03
阅读 2 分钟
5.5k
前言说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制。本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的?加锁成功在前一篇文章中介绍了可重入锁加锁的逻辑,其中 RedissonLock#tryAcquireAsync 方法是进行异步加锁的逻辑。回顾一下这个方法的入参:waitTime:-1;leaseTime:-1,加锁时未指...

Redisson 分布式锁源码 01:可重入锁加锁

2021-07-02
阅读 4 分钟
4.5k
前言相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题!单系统很容易想到 Java 的各种锁,像 synchronize、ReentrantLock 等等等,那分布式系统如何处理?当然是使用分布式锁。如果小伙伴不知道什么是分布式锁,那推荐看看石杉老师的突击课或者在网上搜一搜相关资料。当使用 Redis 作为分布式锁...