Fork me on GitHub

微服务学习----分布式锁

分布式锁

需要加锁条件

  1. 共享资源
  2. 共享互斥锁
  3. 多任务环境

基于MySQL的分布式锁

流程

MySQL中的字段

  1. 每个程序去抢MySQL中的一个字段
    1. 查询这个字段是否已经存在
    2. 插入一个数据到这个字段
    3. 还原这个字段让其他的程序获取锁
  2. 操作资源
  3. 释放资源

问题

  • 资源浪费
    • 当有程序使用到这把锁的时候,其他程序在等待,且其他程序需要每隔一段时间去查看这把锁是否释放
  • 死锁问题
    • 在一个程序获取到这把锁且在操作中的时候这个程序奔溃了,那么MySQL中的这个字段将永远无法被还原
解决死锁方案

用一个外部进程监视这个锁,当超时的时候则将这把锁给释放(将字段还原。这个超时时间很难去把握,实际生产中一般不适用MySQL做分布式锁。

基于redis的分布式锁

流程

  1. 每个程序去抢redis中的一个字段并设置有效期
    1. 查询这个字段是否已经存在
    2. 插入一个数据到这个字段
    3. 还原这个字段让其他的程序获取锁
  2. 操作资源
  3. 释放资源

问题

redis是通过设置有效期来解决MySQL中的死锁问题,可问题就在于这个有效期很难把握。

基于zookeeper的分布式锁

zookeeper是一个分布式一致性服务框架

  • 客户端在操作一个zookeeper节点,其他的zookeeper都会被同步

  • zookeeper可以存储数据,文件系统,zookeeper的目录是可以存储数据的

  • zookeeper的目录类型分为四种

  1. 持久化目录 (客户端操作zookeeper会将目录持久化)
  2. 临时目录 (客户端与zookeeper断开连接目录自动删除)
  3. 持久有顺序目录
  4. 临时有顺序目录
  • zookeeper支持事件回调机制

流程

  1. 程序去zookeeper获取一个临时序号(去/locks/下面获取一个需要)
  2. 序号最小的去访问资源
  3. 之后其他的序号需要找到比他序号小1的目录注册一个删除回调事件
  4. 回调事件通知访问资源

好处

  1. 节省了资源

  2. 通过有序临时节点和事件通知机制巧妙的解决了死锁问题

posted @   Banana_Fish  阅读(171)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示