分布式锁阿
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 个节点解锁成功,就认定解锁成功。这是为了确保在分布式场景中,即使部分节点网络延迟、故障等,也能最大程度保证锁被正确释放,避免死锁 。 实际应用中,还需考虑锁的有效期、时钟漂移等问题对该机制的影响。