微服务学习----分布式锁
分布式锁
需要加锁条件
- 共享资源
- 共享互斥锁
- 多任务环境
基于MySQL 的分布式锁
流程
- 每个程序去抢
MySQL 中的一个字段- 查询这个字段是否已经存在
- 插入一个数据到这个字段
- 还原这个字段让其他的程序获取锁
- 操作资源
- 释放资源
问题
- 资源浪费
- 当有程序使用到这把锁的时候,其他程序在等待,且其他程序需要每隔一段时间去查看这把锁是否释放
- 死锁问题
- 在一个程序获取到这把锁且在操作中的时候这个程序奔溃了,那么
MySQL 中的这个字段将永远无法被还原
- 在一个程序获取到这把锁且在操作中的时候这个程序奔溃了,那么
解决死锁方案
用一个外部进程监视这个锁,当超时的时候则将这把锁给释放(将字段还原
基于redis 的分布式锁
流程
- 每个程序去抢
redis 中的一个字段并设置有效期- 查询这个字段是否已经存在
- 插入一个数据到这个字段
- 还原这个字段让其他的程序获取锁
- 操作资源
- 释放资源
问题
基于zookeeper 的分布式锁
zookeeper 是一个分布式一致性服务框架
客户端在操作一个
zookeeper 节点,其他的zookeeper 都会被同步
zookeeper 可以存储数据,文件系统,zookeeper 的目录是可以存储数据的
zookeeper 的目录类型分为四种
- 持久化目录 (客户端操作
zookeeper 会将目录持久化)- 临时目录 (客户端与
zookeeper 断开连接目录自动删除)- 持久有顺序目录
- 临时有顺序目录
zookeeper 支持事件回调机制
流程
- 程序去
zookeeper 获取一个临时序号(去/locks/ 下面获取一个需要) - 序号最小的去访问资源
- 之后其他的序号需要找到比他序号小
1 的目录注册一个删除回调事件 - 回调事件通知访问资源
好处
-
节省了资源
-
通过有序临时节点和事件通知机制巧妙的解决了死锁问题
分类:
微服务学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!