栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 之分布式锁-redis-Redisson-Zookeeper 不同方式实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 之分布式锁-redis-Redisson-Zookeeper 不同方式实现

Redis 实现分布式锁

原理
采用Setnx 命令 为 key 设置指定的值,设置成功,返回 1 。 设置失败,返回 0

如何考虑避免死锁问题
设置锁的过期时间,避免死锁问题

Redis key过期了,但是业务还没有执行完毕如何处理
采用续命设计:
获取锁成功之后,开启一个续命的线程,检测如果当前业务逻辑还没有执行完毕的情况下,应该不断的延迟过期key的时间,防止死锁 ,限制次数,并且回滚事物

Redis集群,主节点宕机如何处理
Redis集群数据同步改为同步的形式;效率偏低

Redisson实现分布式锁

原理
1 多个jvm同时的在redis中写入一个相同的key(1.使用lua脚本调用redisapi),
谁能够写成功谁就获取锁成功。

2.如果写入key成功,会单独开启一个看门狗的线程(续命定时
任务线程) 默认的情况下每隔10s时间不断续命延迟。

Redis集群,主节点宕机如何处理?
用Redlock 红锁
原理:
1 构建Redis集群没有主从之分,Redis节点都可能为主节点;
2 获取锁的时候,jvm向多个不同的redis服务器端去抢锁,只要有一半的redis服务器执行成功,则表示获取锁成功。

Zookeeper实现分布式锁

原理
1 多个jvm同时在zk上创建一个临时节点/lockPath,最终只能够有一个jvm创建临时节点成功
2 获取锁失败的jvm ,可以采用重试,重试无果 就设置一个事件监听,然后进入到阻塞状态

如何考虑避免死锁问题
如果宕机主动关闭当前会话连接,由于使用临时节点,则该节点自动会被删除

业务超时,一直不释放锁如何处理?
采用续命设计:
获取锁成功之后,开启一个续命的线程,检测如果当前业务逻辑在一定时间内还没执行完就主动释放锁,同时事务回滚

如何避免分布式锁羊群效应问题
基于临时顺序编号节点实现zk锁,当前jvm创建临时顺序节点编号是最小的时候,代表获取锁成功,如果不是最小的就进入阻塞状态,订阅到我们上一个节点

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号