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