网站首页 > java教程 正文
一、基于Redis分布式锁方案
1、Redis天然适合做分布式锁,因为它是单进程单线程的,你所有的请求到Redis里面,它都会进行串行化处理;
2、实现方式
Redis Setnx (SET if Not exists)命令在指定的key不存在时,为key設置指定的值
① SETNX KEY_NAME VALUE Expire_Time --这是它获取锁的一个命令格式
設置一个KEY值,成功返回1说明成功获得锁,設置失败返回0说明获取锁失败
②存在问题
* 锁时间不可控制,它无法续租期,因为如果一个线程获得锁,它在它的Expire_Time时间内还未执行完业务,另外一个线程就可以获取它的锁,这就会导致数据的错乱;
* 单点问题
(1)单实例存在进程一旦死掉,会彻底阻塞业务流程,还有存在一个线程获得锁,这个时候redis挂掉了,后来又马上重启,但是redis里面的锁已经失效,所以另外一个线程就能继续获得锁,导致数据错乱;
(2)主从方式,主从数据异步,也会存在锁失效的问题;
注:所以redis无法保证高可用,那么基于Redis分布式锁到底能不能用,这个时候取由业务场景决定,例如这个锁是交易相关的,那这个锁就要严格要求它的一致性,那Redis是无法满足的。但如果是社交场景发消息,redis分布式锁是能够满足的,顶多我们让消息多重复一遍。Redis分布式锁本身是一个AP模型,所以用它做分布式锁要取决于应用场景,AP模型无法保证数据的一致性,一般我们做分布式锁的时候都需要CP模式,也就是数据要保持一致性;
③ 官方建议
* Redis本身建议使用Redlock算法来保证,但是问题是需要至少三个Redis主从实例来完成,维护成本相对较高。Redlock等同于自己实现简单的一致性协议,细节繁琐,且容易出错。
问题本质:分布式锁是CP模型,Redis集群是AP模型,通过CP模型解决分布式锁问题
二、高可用分布式锁设计目标应该要包含以下几点
1、强一致性;
2、服务高可用,系统稳健;
3、锁自动续约及自动释放;
4、代码高度抽象业务接入极简;
5、可视化管理后台、监控及管理;
- 上一篇: 浅谈分布式锁
- 下一篇: 面试官:Redis分布式锁超时了,任务还没执行完怎么办?
猜你喜欢
- 2024-11-22 redis分布式锁
- 2024-11-22 4K字深度剖析redisson分布式锁原理
- 2024-11-22 java都为我们提供了各种锁,为什么还需要分布式锁?
- 2024-11-22 一文带你了解Java手写分布式锁的实现
- 2024-11-22 如何用Redisson框架实现分布式锁?
- 2024-11-22 基于 Redis 实现的分布式锁
- 2024-11-22 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我
- 2024-11-22 面试官:Redis分布式锁超时了,任务还没执行完怎么办?
- 2024-11-22 浅谈分布式锁
- 2024-11-22 分布式锁系列一:基于Redis SETNX命令实现分布式锁
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)