![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redisson
文章平均质量分 81
程序员小航
这个作者很懒,什么都没留下…
展开
-
Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch
前言Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch。Semaphore意思就是在分布式场景下,只有 3 个凭证,也就意味着同时只会有三个线程执行业务。设置凭证参数列表:KEYS[1]:指定的 key 这里叫 semaphoreKEYS[2]:redisson_sc:{semaphore}ARGV[1]:凭证数 3这块 lua 脚本相对简单,直接设置一个 key 的 value 为 3。获取凭证参数列表:原创 2021-07-15 15:04:39 · 191 阅读 · 0 评论 -
Redisson 分布式锁源码 10:读写锁
前言Redisson 还支持可重入读写锁,允许在分布式场景下,同时有多个读锁和一个写锁处于加锁状态。使用读写锁Redisson 读写锁实现了 JUC 下的 ReadWriteLock,使用方式基本相同。源码加锁源码基本和之前的可重入锁加锁无区别,唯一的差异就是在 Lua 脚本这里。所以下面着重分析 Lua 脚本。读锁源码源码地址:org.redisson.RedissonReadLock#tryLockInnerAsync参数列表:KEYS[1]:锁名字 anyRWLockKEYS原创 2021-07-13 10:08:55 · 268 阅读 · 0 评论 -
Redisson 分布式锁源码 09:RedLock 红锁的故事
前言RedLock 红锁,是分布式锁中必须要了解的一个概念。所以本文会先介绍什么是 RedLock,当大家对 RedLock 有一个基本的了解。然后再看 Redisson 中是如何实现 RedLock 的。在文章开头先说明 Redisson RedLock 建议不要使用!!!在文章开头先说明 Redisson RedLock 建议不要使用!!!在文章开头先说明 Redisson RedLock 建议不要使用!!!重要的事情重复三遍!什么是 RedLock?RedLock,这块可以从网上搜到很原创 2021-07-12 18:43:42 · 894 阅读 · 0 评论 -
Redisson 分布式锁源码 08:MultiLock 加锁与锁释放
前言基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的 Redisson 实例。当然,这是官网的介绍,具体是什么?一起看看联锁 MultiLock 使用以及源码吧!MultiLock 使用按照官方文档的说法,这里 Redisson 客户端可以不是同一个。当然,一般工作中也不会说不用一个客户端吧。加锁在阅读 MultiLock 加锁之前,小伙伴应该已经阅读过普通加锁的相原创 2021-07-10 10:02:28 · 621 阅读 · 3 评论 -
Redisson 分布式锁源码 07:公平锁释放
前言看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,这块公平锁和非公平锁并无区别。前文已经了解到,公平锁加锁失败之后,会将当前放到等待队列中,通过 Java 代码中的循环不断尝试获得锁。锁释放主动释放源码:RedissonFairLock#unlockInnerAsyncKEYS[1]:加锁的名字,anyLock;KEYS[2]:加锁等待队列,redisson_lock_queue:{anyLock};KEYS[3]:等待队列中原创 2021-07-09 10:01:32 · 189 阅读 · 0 评论 -
Redisson 分布式锁源码 05:公平锁加锁
前言默认的加锁逻辑是非公平的。在加锁失败时,线程会进入 while 循环,一直尝试获得锁,这时候是多线程进行竞争。就是说谁抢到就是谁的。Redisson 提供了 公平锁 机制,使用方式如下:RLock fairLock = redisson.getFairLock("anyLock");// 最常见的使用方法fairLock.lock();下面一起看下公平锁是如何实现的?公平锁相信小伙伴们看过前面的文章,已经轻车熟路了,直接定位到源码方法:RedissonFairLock#tryLock原创 2021-07-07 08:12:33 · 661 阅读 · 2 评论 -
Redisson 分布式锁源码 04:可重入锁释放
前言前面已经了解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。当锁加锁成功之后,锁是如何释放的?主动释放源码入口:RedissonLock#unlock在解锁时会获取当前线程的id。一路往里跟,直接来到 RedissonLock#unlockInnerAsync:分析一下 lua 脚本的内容:如果锁不存在,直接返回 null;如果锁存在,则对锁的重入次数 -1;剩余重入次数大于 0,重新设置过期时间,返回 0;剩余重入次数不大于 0,删除 redis key 并发布消息,返回原创 2021-07-05 11:06:04 · 136 阅读 · 0 评论 -
Redisson 分布式锁源码 03:可重入锁互斥
前言看过可重入锁的 Lua 脚本,已经可以知道当锁存在时,是会加锁失败的。下面看一下,加锁失败之后是如何处理的呢?加锁 Lua 脚本在 lua 脚本中,前两段 if 分别排除了两种情况:锁不存在;锁存在且是自己线程(可重入);剩下的情况就是锁存在,但是不是自己,也就意味着加锁失败。执行 pttl 命令,返回锁的剩余时间。加锁失败后的处理源码定位:org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, b原创 2021-07-05 08:09:57 · 156 阅读 · 0 评论 -
Redisson 分布式锁源码 02:看门狗
前言说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制。本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的?加锁成功在前一篇文章中介绍了可重入锁加锁的逻辑,其中 RedissonLock#tryAcquireAsync 方法是进行异步加锁的逻辑。回顾一下这个方法的入参:waitTime:-1;leaseTime:-1,加锁时未指定锁时间,则为 -1,如果指定,则是指定的时间;unit:null;threadId:当前线程 id。其中的 tr原创 2021-07-03 16:24:58 · 561 阅读 · 0 评论 -
Redisson 分布式锁源码 01:可重入锁加锁
前言相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题!单系统很容易想到 Java 的各种锁,像 synchronize、ReentrantLock 等等等,那分布式系统如何处理?当然是使用分布式锁。如果小伙伴不知道什么是分布式锁,那推荐看看石杉老师的突击课或者在网上搜一搜相关资料。当使用 Redis 作为分布式锁时,当前使用较多的框架就是 Redisson。当然 Redisson 也不仅仅只能当做锁来使用,也有很多其他的功能,小伙伴们可以看一看官方文档,自己多动手实践一下。原创 2021-07-02 08:24:29 · 306 阅读 · 2 评论