分布式锁
2021-08-24 22:57:37 31 举报
AI智能生成
分布式锁redis、zk锁相关内容
作者其他创作
大纲/内容
Redis分布式锁
Redisson框架
基于redis实现了一系列开箱即用的高级功能,比如分布式锁
原理
加锁
客户端
向集群某一master节点,发送lua脚本,执行加锁逻辑lock(key,time)
lua脚本
加锁
可重入,下次再加锁时,lua脚本判断客户端id是不是自己的,是的话支持重入,加锁次数+1
开启watchdog看门狗
这是个后台线程,每 time/3 s执行一次,刷新锁的过期时间
客户端宕机时,看门狗线程被销毁,key按ttl过期消失
其他客户端
执行加锁逻辑
已加锁
等待锁释放
未加锁
直接加锁
释放锁
加锁次数为0时
执行lua脚本删除对应的缓存key
LockName = id + threadId , 其他客户端执行unlock时先判断当前threadId是否在字典里
锁类型
hash key
myLock:"874398-843k0-0835-9884-87774:1"
里面会保存客户端id,其他客户端不可重入锁 or 删除锁
图解
分支主题
Zookeeper分布式锁
Curator框架
基于zookeeper进行优化,实现分布式锁等功能
优化了zookeeper存在的羊群效应
即几十个客户端同时竞争一把锁的情况下
锁释放时,需要通知所有的几十个客户端
竞争加锁时,几十个客户端乱哄哄的争抢加锁
保证了在锁释放时,只需要通知顺序子节点即可
同时只有顺序节点拿到锁,没有其他几十个客户端争抢锁这种情况出现
原理
加锁
客户端
执行加锁逻辑,生成节点 /usr/lock/
它是第一个进行加锁的客户端
生成临时顺序节点 /usr/lock/******01
分支主题
其他客户端
节点 /usr/lock/已经生成
且已经有一个子节点存在
生成临时顺序节点 /usr/lock/******02
分支主题
其他客户端
节点 /usr/lock/已经生成
且已经有两个子节点存在
生成临时顺序节点 /usr/lock/******03
释放锁
删除临时顺序节点
通知下一个临时顺序节点节点进行加锁
图解
分支主题
分布式锁应对高并发场景
分段加锁+合并扣减
相当麻烦的一套逻辑实现
大公司一般都有分布式kv存储
tair,redis,mongodb,高并发,每秒几万几十万都没问题,甚至每秒百万
实时库存数据放kv存储里去,先查库存再扣减库存,你在操作库存的时候,直接扣减
如果你发现扣减之后是负数的话,此时就认为库存超卖了,回滚刚才的扣减,返回提示给用户
对kv做的库存修改写MQ,异步同步落数据库,相当于异步双写,用分布式kv抗高并发,做好一致性方案
0 条评论
下一页