背景

使用@SchedulerLock可以实现比较轻量级的简单的定时任务,也可以实现分布式锁,那具体的原理是啥?

一探究竟

不熟悉的同学可以先看一下用法:
https://www.baeldung.com/shedlock-spring

大概就是定义一个数据表

注意这里的name是primary key,是不可重复的。利用了primary key的这个特性,实现了锁的抢占。细节下面会介绍

然后加注解实现:

看源码

直接从注解出发,看源码
在注解所在的包内发现一个DefaultLockManager

一看有executeWithTask,应该就是这个代码了

一直往里看

doLock

insertRecord,看jdbc的实现

获取锁逻辑

其实很简单,就是一个sql语句

INSERT INTO tableName (name, lock_until, locked_at, locked_by) VALUES(锁名字, 当前时间+最多锁多久, 当前时间, 主机名)

如果插入成功了,就说明抢到了锁。否则认为抢不到。

如果记录已经存在了,就用更新记录来抢锁

UPDATE  tableName  SET lock_until = 当前时间+最多锁多久, locked_at = 当前时间, locked_by = 主机名 WHERE name = 锁名字 AND lock_until <= 当前时间

找到同一个name的锁,如果发现lock_util小于等于当前时间(锁已经无效),就可以去update;多个机器同时update,只有一个机器可以update成功(修改行数>0),实现了锁的抢占。

释放锁逻辑


注:lockTime = 最小锁时间 和 当前时间的较大值

UPDATE tableName SET lock_until = lockTime WHERE name = 锁名字

假设最小锁时间30s,当前时间只过了15s,那么就会最小锁时间;否则用当前时间。
这个就是为了保证最少也要锁 最小锁时间 (30s)

总结

SchedulerLock利用mysql实现了分布式锁。
抢锁:
通过插入同一个name(primary key),或者更新同一个name来抢
释放锁:
通过设置lock_until来实现释放,再次抢锁的时候需要通过lock_util来判断锁失效了没。

SchedulerLock 分布式锁 原理相关推荐

  1. api 创建zookeeper客户端_zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  2. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  3. Apache Curator之分布式锁原理(二)

    本文主要讲解如下内容: 为什么要使用分布式锁? 分布式锁特性! 分布式锁的实现方式有哪些? Curator分布式锁原理 Curator分布式锁实现类UML及相关类的介绍 基于Redis,数据库实现分布 ...

  4. zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  5. Redisson实现分布式锁原理

    Redisson实现分布式锁原理 一.高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设计分布式锁,这里我认为以下几点是必须要考虑的. 1.互斥 ...

  6. Redis分布式锁原理

    业务背景: 后台定时任务刷新Redis的数据到数据库中,有多台机器开启了此定时同步的任务,但是需要其中一台工作,其他的作为备用,提高可用性.使用Redis分布式锁进行限制,拿到锁的机器去执行具体业务, ...

  7. Redission 分布式锁原理

    Reddission 分布式锁原理 总结: 使用无参的tryLock()方法时,redisson会自动添加一个定时任务,定时刷新锁的失效时间,如果unlock时失败,则会出现该锁一直不释放的情况, 因 ...

  8. Zookeeper分布式锁原理

    1.分布式锁介绍 单机应用开发,涉及并发同步的时候,我们往往采用synchronized 或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 但当我 ...

  9. Redisson 实现分布式锁原理

    Redisson实现分布式锁 有关Redisson作为实现分布式锁,总的分3大模块来讲. 1.Redisson实现分布式锁原理 2.Redisson实现分布式锁的源码解析 3.Redisson实现分布 ...

最新文章

  1. ==和equals的简单比较
  2. thinkphp分页格式的完全自定义,直接输入数字go到输入数字页
  3. Linux┊理解devfs、sysfs、udev、tmpfs
  4. C++回调函数用法(zt)
  5. SQL Server 行列转换(1)
  6. 解决java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor问题
  7. java 正则匹配括号是否成对_十分钟学会正则表达式
  8. java 蓝桥杯算法训练 猴子分苹果(题解)
  9. 一个wepy开发微信小程序时图片在真机上不显示的问题
  10. 下载与eclipse匹配的hibernate tools
  11. Sql Decimal类型 运算结果的精度和小数位数
  12. LeetCode 134. Gas Station
  13. AcWing 828. 模拟栈
  14. STL之map容器的详解
  15. discuz uc_server 配置登录
  16. 2022年CISP报名考试详情
  17. centos7.5安装Jenkins
  18. 电商小程序开发要多少钱?一文看懂电商小程序开发成本
  19. “电动车之王”还不够,雅迪高端品牌怎么打?
  20. 软工实践 - 第十一次作业 Alpha 冲刺 (3/10)

热门文章

  1. c语言左移函数_corl_,全国计算机等级三级网络技术上机题库100套.doc
  2. SASS使用CSS3动画并使动画暂停和停止在最后一帧的简单例子
  3. Analog Efex Pro 2 for Mac(胶片特效滤镜软件)
  4. 文哥要加肉泡姑娘了……
  5. 创业商业模式设计与实务
  6. css设置背景透明 兼容,每日一更之CSS背景透明内容不透明及CSS兼容性写法
  7. 生成对抗网络-改进方法|深度学习(李宏毅)(二十四)
  8. Linux定时器jiffies学习
  9. tomcat配置日志存放地址
  10. 简述python爬虫原理_python 爬虫原理