当前位置:网站首页>redis高阶使用之Redisson分布式锁源码解析
redis高阶使用之Redisson分布式锁源码解析
2022-08-02 07:35:00 【孰能生巧-LWP】
一、何为分布式锁
1、锁synchronized lock 单机锁
2、我们的一些互斥资源 不能并行执行 需要一个东西来保证是串行执行的 锁synchronized
3、分布式锁:这个锁存储一定是独立于我们业务服务的
二、自己设计一个锁,如何实现
需求:
1、只能有一个线程能同时能同时执行互斥的资源
2、其他的线程执行的时候,有线程在执行的话,要么等待,要么报错实现步骤:
1、有一个标记来标记是不是有线程在执行 厕所 坑 门 lock state=1 有人在做 =0 没人在做
2、这个标记必须是可见 保证相互之间这个标记是能拿到最新结果的 volatile
3、获取这个标记不能同时抢占成功 安全 cas三、Redis中怎么做分布式锁
1、标记 k-v结构 key作为一个标记 这key存在的话说明有人在做,如果不存在,说明没人在做
2、可见性 单线程 必须set完,你才能get
3、保证原子性 setnx 单线执行
if(exists("pay:11") == 0) {
set("pay:111",1);
}
4、我们希望 exists跟set2个指令之间,不能插入其他指令 要保证多指令的原子性 mulit开启事务 - exec 提交 discard 回滚四、事务
1、命令是原子的 但是不能根据中间的指令来决定后续的逻辑五、lua脚本
1、必须要有宿主 redis完美的支持lua脚本
2、eval "return 'huihui'" 0
3、eval "if KEYS[1]=='1' then ARGV[1] end return ARGV[2]" 1 1 'huihui' 'xiaohuihui' 第一个参数是 KEY个数 第二个是KEY的值 第三个是ARGV1的值 第四个是ARGV2的值
4、做重复锁怎么做?同一个线程能加锁加多次
4.1 互斥的key 大key
4.2 知道线程信息 field
4.3 保存冲入次数 value hincrby 线程安全的
4.
5、假如30s锁会过期,但是业务没有执行完 锁就会失效六、Redission锁原理源码分析
1.lua + hash去做
if (redis.call('exists', KEYS[1]) == 0)
then " +
"redis.call('hincrby', 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]);",
2、如果说我让我们去续期的话?
3、定时的去看这个东西在,如果在,我给他重新设置过期时间!如果不在,我不设置了
4、hashwheelTimer 也是定时任务七、watchDog看们狗机制之时间轮算法原理源码解析
1、联锁:给你同时往多个主节点+同一个锁
Redis做分布式锁的时候,会有多丢失 ap模型
减少丢失面试题:
1、有家足浴店 他们的技师是这样安排的,总共有8个技师、
技师1:负责0-3的客人
技师2:负责3-6的客人
技师3:负责6-9的客人
技师4:负责9-12的客人
技师5:负责12-15的客人
技师6:负责15-18的客人
技师7:负责18-21的客人
技师8:负责21-24的客人
假如 哪天放假 早上6点,我想预约一个9个小时之后的按摩,会由哪个技师为我服务?
6点 6+9=15个小时侯要去按摩 15点之后的 6 已经有人在排队 你也得排队假如现在的时间是21点,我想预约一个6小时侯后 哪个技师来服务
21+6 27个小时 2
边栏推荐
- Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案
- HCIP 第四天
- HCIP 第十二天
- 5分钟搞懂MySQL - 行转列
- Fatal error compiling: 无效的目标发行版: 11
- Control 'ContentPlaceHolder1_ddlDepartment' of type 'DropDownList' must be placed inside a form tag with runat=server.
- JVM垃圾回收与性能调优方式
- redis-advanced
- Introduction to mysql operation (4) ----- data sorting (ascending, descending, multi-field sorting)
- 2022年防止网络攻击的15个网络安全实践,你学会了吗?
猜你喜欢
MySQL常见索引类型
PLSQL Developer安装和配置
【CV】OpenVINO installation tutorial
数据表格化打印输出
牛客2022 暑期多校4 D Jobs (Easy Version)(递推优化策略)
Understand the Chisel language. 30. Chisel advanced communication state machine (2) - FSMD: Take Popcount as an example
MySQL压缩包方式安装,傻瓜式教学
PanGu-Coder: A function-level code generation model
如何将项目部署到服务器上(全套教程)
MySQL-Execution Process + Cache + Storage Engine
随机推荐
typescript学习
redis的安装与应用
Data Middle Office: Started in Ali, Prosperous in DaaS
pnpm install出现:ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies
MySQL database design specification
五款优秀免费的在线抠图工具
MySQL error 1055 solution: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains
CSRF-Cross-site request forgery-related knowledge
(2022 Niu Ke Duo School 5) B-Watches (two points)
设置 height: auto 却无法触发 transition 动画的解决方案
spark read local file
通过建立新的SaaS业务来推动增长的六种方法
HCIP 第四天
A full review of mainstream timed task solutions
uni.navigateBack 中的坑
WebGPU 导入[2] - 核心概念与重要机制解读
类型“DropDownList”的控件“ContentPlaceHolder1_ddlDepartment”必须放在具有 runat=server 的窗体标记内。
5分钟搞懂MySQL - 行转列
研发创新编码器霍尔板,引领企业高质量发展
CollectionUtil: a collection of functional style tool