分布式锁分析:使用Redis实现分布式事务中的锁机制
2023-02-26 12:28:04 时间
分布式协调服务
- Zookeeper是分布式协调服务框架
- 分布式协调技术: 主要用来解决分布式环境当中多个进程之间的同步控制,让进程有序的去访问某种临界资源,防止造成”脏数据”的后果
- 分布式协调技术的核心就是实现分布式锁
分布式锁
- 分布式锁: 为了防止分布式系统中的多个进程之间相互干扰,需要分布式协调技术对进程进行调度,这个分布式协调技术的核心就是实现分布式锁
分布式锁条件
- 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
- 高可用的获取锁与释放锁
- 高性能的获取锁与释放锁
- 具备可重入特性
- 具备锁失效机制,防止死锁
- 具备非阻塞锁特性
分布式锁的实现
- Zookeeper
- Redis
- Memcached
- Chubby
Redis分布式锁的实现
- 分布式锁实现的三个核心要素:加锁,解锁,锁超时
- Redis是单线程的
加锁
- 使用setnx命令
- key是锁的唯一标识,按业务来决定命名
- value可以设置成任意值
- 当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到锁.当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败
解锁
- 当得到锁的线程执行完任务,需要释放锁,以便其它线程可以进入,使用del指令释放锁之后,其它线程就可以继续执行setnx命令获得锁
锁超时
- 一个得到所得线程在执行任务的过程中出现问题,不能显式释放锁,这些资源将永远被锁住,造成死锁的状态
- setnx的key要设置一个超时时间,保证锁没有被显式释放时,会在一定时间后自动释放.setnx不支持超时参数,需要额外的指令expire
-
Redis分布式锁问题:
-
非原子性操作:
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
- 解决方案: 通过使用set命令set(key,value,expire) 设置为原子操作
-
误删锁:
- 在设置锁超时的情况下,操作没有完成,当操作完成时,del命令删除的是其它进程的锁
- 解决方案: 判断是否为本进程的锁.带着key和value=threadID线程ID判断是否为本进程的锁
-
在设置锁超时的情况下,操作没有完成
- 解决方案: 释放锁时判断操作是否完成, 增加守护线程:为锁超时加时,延迟释放
-
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- 数据结构---单向链表
- js Symbol数据类型
- 大数据NiFi(十):集群页面导航、操作区介绍和模板操作
- vue3 setup语法糖
- Spring Boot 构建多租户系统 实现动态切换数据源
- 这套设备管理方案助你效率10倍提升
- form表单中的enctype属性
- 【生信技能树培训】R语言中文件的读取
- html5视频背景插件vidbacking
- WordPress零基础新手建站完整教程
- Mac MongoDB 安装
- ACL 2022 | 基于长度感知注意机制的长度可控摘要模型
- koa 实现一个翻页查询
- 【k哥爬虫普法】简历大数据公司被查封,个人隐私是红线!
- 大文件geojson渲染,geojson转pbf矢量切片工具下载!
- 【k哥爬虫普法】非法入侵计算机信息系统,获取1500万余条个人信息!
- 【k哥爬虫普法】爬取数据是否一定构成不正当竞争?
- 看这篇就够了丨基于Calcite框架的SQL语法扩展探索
- 性能测试|电商业务性能测试(二): Jmeter 参数化功能实现注册登录的数据驱动
- 性能测试|电商业务性能测试(二): Jmeter 参数化功能实现注册登录的数据驱动