ZooKeeper 分布式锁 Curator 源码 :可重入锁

2021-07-16
阅读 5 分钟
3.8k
一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Spring @Transactional 注解是如何执行事务的?

2021-06-25
阅读 5 分钟
5.5k
前言相信小伙伴一定用过 @Transactional 注解,那 @Transactional 背后的秘密又知道多少呢?Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢?画图猜测在开始 debug 阅读源码之前,小伙伴们应该已经知道 MySQL 是如何开启事务的。因此可以得出猜测:那下面跟着源码一起读一读,Spring 的 @Transactional ...

为了不写接口文档,我肝了个 IDEA 插件!

2021-06-17
阅读 2 分钟
2.1k
前言写代码的快乐,在于通过一顿猛如虎的操作,实现了自己设计的逻辑流程。(也可能并不是很快乐!)这时候,你以为就可以关机么?还有接口文档没写呢!哈?开始进入无限 CV 模式,各种请求参数、必填非必填、请求返回示例!几分钟后…… 🤬🤬🤬我要写个 IDEA 插件,以后再也不想手写文档了!下面,来看看我肝出来的插件吧!...

MySQL next-key lock 加锁范围总结

2021-06-17
阅读 2 分钟
3.7k
前言三篇文章分别通过实际操作,介绍了主键、非主键唯一索引、普通索引、普通字段四个方面介绍了加锁的范围。本篇文章再做一个总结。data_locks {代码...} LOCK_MODELOCK_DATA锁范围X,REC_NOT_GAP1515 那条数据的行锁X,GAP1515 那条数据之前的间隙,不包含 15X1515 那条数据的间隙,包含 15LOCK_MODE = X 是前开后闭区间...

MySQL普通索引的加锁

2021-06-08
阅读 3 分钟
5.2k
前言前面已经介绍了主键索引的加锁范围和非主键唯一索引的加锁范围。主键索引:加锁时,会先给表添加意向锁,IX 或 IS;加锁是如果是多个范围,是分开加了多个锁,每个范围都有锁;(这个可以实践下 id < 20 的情况)主键等值查询,数据存在时,会对该主键索引的值加行锁 X,REC_NOT_GAP;主键等值查询,数据不存在时...

看来,MySQL next-key lock 的 bug 并没有被修复!

2021-06-06
阅读 5 分钟
3.8k
前言在上一篇文章《MySQL next-key lock 加锁范围是什么?》中已经介绍了主键索引的加锁范围,现在来回顾一下:加锁时,会先给表添加意向锁,IX 或 IS;加锁是如果是多个范围,是分开加了多个锁,每个范围都有锁;(这个可以实践下 id < 20 的情况)主键等值查询,数据存在时,会对该主键索引的值加行锁 X,REC_NOT_GA...

MySQL next-key lock 加锁范围是什么?

2021-06-06
阅读 6 分钟
37.8k
前言某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是:这都是啥啥啥???这一个截图我啥也看不出来呀?仔细一看,好像似曾相识,这不是《MySQL 45 讲》里面的内容么?什么是 next-key lockA next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the in...

使用 Docker 安装并连接 MySQL

2021-06-06
阅读 1 分钟
3.7k
作为开发,在本机捣鼓一下 Docker 还是很有必要的,本篇文章介绍如何使用 Docker 安装 MySQL,并在终端(iTerm2)使用命令连接 MySQL。

Mac 常用软件推荐 —— Java 开发工程师

2021-05-24
阅读 3 分钟
3.9k
前言记录一下自己用的 Mac 软件,如果小伙伴需要,可以下载体验一下。在 Github 上有一个地址:[链接]这里仅介绍我所使用过,并一直在使用,而且觉得很不错的软件推荐给小伙伴。开发工具作为开发,必须得把吃饭的家伙放在第一位!IntelliJ IDEA相关地址:IntelliJ IDEAIDEA,就是吃饭的家伙,没啥可介绍的。这里额外推荐...

Toolkit 大更新:UI 更美观,用起来更方便!

2021-04-18
阅读 3 分钟
1.4k
前言前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了。就突然想起来,很久没有更新这个插件。PS:我是用它申请了 License,一般时候使用 Json 格式化功能。趁着周末,更新了下版本,下面介绍直接介绍更新后的版本。功能介绍UI 界面这次修改最大的就是 UI 界面,基本参考 Doc View 的 UI,全面进行改造,同时...
封面图

工作中的设计模式 —— 建造者模式

2021-04-18
阅读 3 分钟
1.3k
前言建造者模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。一个 Builder 类会一步一步构造最终对象。这个 Builder 类是独立于其他对象的。使用场景在阅读源码过程中经常看到建造者模式,主要是为了简化复杂对象的创建。具体那些房子啥的举例子就不扯...

工作中的设计模式 —— 策略模式

2021-04-08
阅读 3 分钟
1.6k
按照上面的 if else 逻辑,其中 aaa、bbb、ccc 就是不同的策略。而使用策略模式的目的,就是当又增加了 ddd、eee 等等的时候,更方便的扩展。

IDEA 文档插件 DocView 版本更新:支持编辑文档注释

2021-04-06
阅读 2 分钟
2.4k
前言IDEA 文档插件 Doc View 又更新了新版本,本次更新版本如下:支持在方法右键菜单选择 Doc Editor 直接编辑文档编辑接口文档名称编辑接口描述编辑字段是否必填编辑字段注释说明点击确定, 会回写到源文件的注释中支持在 Entity 中通过邮件菜单选择Doc Editor 编辑字段信息编辑字段是否必填编辑字段注释说明点击确定, ...

工作中的设计模式 —— 原型模式

2021-04-06
阅读 3 分钟
1.2k
比如咱们项目中有 BO、DTO、VO,但是在开发过程中,需要各种转换,get/set,一般情况下大家都会使用 BeanUtils,将一个类的属性值 set 到另一个类的属性值中,然后返回。

IDEA 敏捷开发技巧——实时模版

2021-03-07
阅读 2 分钟
1.2k
前言本文通过自定义模版,在 IDEA 中,通过简单的几个字符,快捷生成既定的代码。示例自定义模版如何自定义模版Windows and LinuxFile -> Settings -> Editor -> Live Templates macOSIntelliJ IDEA -> Preferences -> Editor -> Live Templates先添加一个 group,表示这里都是自己自定义的。这个名字...

IDEA 敏捷开发技巧——后缀完成

2021-02-20
阅读 2 分钟
1.7k
前言“工欲善其事,必先利其器。”所以说今天来看一看如何压榨 IDEA ,让你的 IDEA 使用的更顺手!今日技巧:后缀完成自定义后缀完成模版示例上面动图使用了 .sout .if 来举例,相信有些小伙伴在工作中经常使用。如果没有使用过,也可以🦑尝试一下。自定义后缀模版因为打印日志的时候,为了方便日志的查看,一般会将实体打...

Spring 事务、异步和循环依赖有什么关系?

2021-02-02
阅读 4 分钟
2.5k
前言在循环依赖中有一种循环依赖,就是自注入:自己依赖自己。事务的自注入在 Spring 自调用事务失效,你是怎么解决的? 有小伙伴提出可以自己注入自己来解决事务失效。具体使用方式如下: {代码...} 是不是发现很神奇的事情,事务生效了。其实这里注入自己,其实是注入的一个代理对象,调事务,也是调的代理对象的事务...

Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

2021-01-31
阅读 6 分钟
3.7k
前言在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的。同样在上一节留下了疑问:循环依赖为什么要使用三级缓存?而不是使用二级缓存?AOP 动态代理对循环依赖的有没有什么影响?本篇文章也是围绕上面的内容进行展开。笔记也在不断整理,之前可能会有点杂乱。循序渐进,...

Spring 是如何解决循环依赖的?

2021-01-26
阅读 5 分钟
16.9k
Requested bean is currently in creation: Is there an unresolvable circular reference?