当前位置: 首页 > news >正文

分布式锁阿

1.什么是分布式锁?

①分布式锁是在分布式场景中使用的锁,用于保证数据的一致性

②分布式系统由多个节点组成,节点可能分布在不同机器和网环境当中

③分布式锁的概念和互斥锁几乎一样,使用的环境是在分布式场景之中

④分布式的应用通常在raft算法rpc框架中经常出现

2.分布式锁的实现

①.分布式锁由资源和行为两部分构成:资源是存储锁的位置,行为是加锁和解锁。

②.资源通常存储在数据库或分布式配置中心(如Zookeeper或ETCD)。

③.行为通过网络通信实现,包括发送数据包和接收响应。

④.加锁成功时,资源位置打上当前进程的唯一标识。

⑤.解锁时,只有持有锁的进程才能解锁。

3.分布式锁的特性

①.互斥性:同一时刻只允许一个执行体进入临界资源。

锁打上标记:加锁

锁取消标记:解锁

标记:执行体的唯一标识

②锁超时:  上锁的时候会给共享区域打上标记 如长时间没解锁会触发锁超时 自动解锁

③.可用性:确保资源在合理时间内得到合理回复。

实现方式:备份,主从切换

④.容错性:允许节点异常和网络异常,确保服务可用。

通过一致性算法来保证容错性

4.分布式锁的类型

①.重入锁:允许同一个线程多次获取锁。

②.非重入锁:不允许同一个线程多次获取锁。

③.公平锁:按照线程到达顺序分配锁,确保公平性(排队1)。

④.非公平锁:不保证线程按照到达顺序获取锁,可能出现饥饿现象(轮询)。

5.锁超时的处理

①.锁超时问题:由于网络或进程异常,导致锁无法及时释放。

②.解决方案:通过超进程定时检查锁是否超时,并自动解锁。

③.超进程:定时检查数据库中的锁标记,超时后自动删除。

6.基于MySQL实现分布式锁

①.存储:将锁信息存储在MySQL表中,通过唯一约束实现互斥语义。

②.加锁:通过插入语句打上锁标记,返回影响行数判断加锁是否成功。

③.解锁:通过删除语句释放锁,返回影响行数判断解锁是否成功。

④.非公平锁:由于MySQL无法实现排队和通知,只能通过轮询实现非公平锁。

优点安全性高

缺点效率低

注:mysql是计算和存储是一体化的

7.基于Redis实现分布式锁

①.存储:将锁信息存储在Redis中,利用Redis的原子操作实现互斥语义。

②.加锁:通过SETNX或RedLock算法实现加锁,返回结果判断加锁是否成功。

③.解锁:通过DEL语句释放锁,返回结果判断解锁是否成功。

④.公平锁:通过队列(排队)和通知机制实现公平锁,需要额外的数据结构和逻辑支持。

8.readlock

这是 Redlock 算法相关的加锁和解锁逻辑 :

加锁:基于分布式系统中多数派原则(quorum 机制 ),向 5 个 Redis 节点尝试加锁,只要有 3 个(超过半数,即多数派 )节点加锁成功,就认为加锁成功。这样做是为了在部分节点故障等情况下,仍能保证同一时刻只有一个客户端能获取到锁,防止分布式环境下的锁冲突 。

解锁:同样向 5 个节点发起解锁操作,当 3 个节点解锁成功,就认定解锁成功。这是为了确保在分布式场景中,即使部分节点网络延迟、故障等,也能最大程度保证锁被正确释放,避免死锁 。 实际应用中,还需考虑锁的有效期、时钟漂移等问题对该机制的影响。

http://www.dtcms.com/a/122870.html

相关文章:

  • 软件功能性测试有多重要?功能性测试工具有哪些?
  • Cocos Creator新手学习
  • day25学习Pandas库
  • mysql的主从复制
  • 中文语义相似度 + 去除标签后的网页文本(爬虫数据)
  • 彩色路径 第32次CCF-CSP计算机软件能力认证
  • 服务器运维ACL访问控制列表如何配置
  • 【Leetcode-Hot100】字母异位词分组
  • echarts图表相关
  • 【智能体开发】智能体前后端开发方案
  • 信奥赛之c++课后练习题及解析(算数运算符)
  • Java学习总结-线程池
  • 【NLP 56、实践 ⑬ LoRA完成NER任务】
  • 【golang】堆和栈的区别
  • MySQL主从复制技术详解:原理、实现与最佳实践
  • Docker与Kubernetes在ZKmall开源商城容器化部署中的应用
  • Linux内核页表缓存(TLB)与巨型页
  • 使用Alamofire下载网站首页内容
  • PDFBox/Itext5渲染生成pdf文档
  • Php laravel 留言板 curd 实战
  • 2025数据库系统工程师上午考试知识点汇总
  • 【C++游戏引擎开发】第10篇:AABB/OBB碰撞检测
  • error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408
  • 【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论
  • 【ida】ida笔记
  • C语言指针和函数
  • CSS 笔记——Flexbox(弹性盒布局)
  • react-router children路由报错
  • 配置SSMS 让数据库中会话时长大于30秒的自动终止
  • python爬虫发送请求的方法汇总