Redis实现分布式锁
系列文章基于Redis2.8版本
1:Redis学习资料收集
2:Redis基础数据结构
3:Redis实现分布式锁
官方实现 https://redis.io/topics/distlock 官方实现--翻译中文 http://www.redis.cn/topics/distlock.html
声明:看了很多文章,大多数文章都是摘取了官方文档,或者在上面进行加工,所以建议大家可以看上面的参考文档。
3.1 为什么需要分布式锁
系统里面有一些资源是竞争保护性资源。例如抢购活动中的商品库存。
然而我们后台系统一般会使用负载均衡,微服务等。会导致有多个JVM实例,所以我们Java的同步代码块synchronized,以及java.util.concurrent.locks包下常用的方法就不能满足需求。
解决办法:
1:基于数据库的乐观锁,和排它锁。
2:基于Zookeeper创建临时节点。
3:基于Redis实现。
3.2 实现分布式锁要实现的关键点
互斥:只能有一个客户端拥有所。
不会发生死锁:持有锁的客户端异常,超时,能正确释放锁。
容错性:只有大部分Redis节点正常运行,客户端就应该可以正常的加锁,解锁。
3.3 通过Redis实现(单个Redis实例)
3.3.1 获取锁
SET lock_key lock_value NX PX timeout lock_key:我们获取的锁 lock_value:锁的值 NX:保证只有键不存在的时候插入 PX timeout:设置键的过期毫秒数
3.3.2 解锁
解锁通过Lua脚本实现
因为get del 不能保证语义的原子性
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
4 Java代码实现
5 其他问题
锁的可重入性怎么实现
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
DevOps与自动化测试的新挑战
DevOps与自动化测试的新挑战 DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠,然而质量管理和测试在其中也起到关键性的作用。 相信这个环形图已经并不陌生了。 结构大致就是以上,那么在持续集成中对测试有哪些要求? 又有哪些挑战呢? 我觉得测需要做到 1. 测试一切 文档、配置、环境、发布包 2. 测试阶段与工具选择 a.Selenium b.Appium c.TestNg c. Jmeter 3. 自动化测试设计原则最优化 a. 统一规范要求 b. 分层设计 c. 易维护易使用 d. 测试用例定位准确 4. 在实际过程中可能遇到的挑战 a. 监管阻碍 b. 流程复杂 c. 交流、沟通阻碍 d. 不合理的应用平台、工具 ...
- 下一篇
开发人员眼中的 DevOps
开发人员眼中的 DevOps 1、我的理解 DevOps 是什么? DevOps 来自于Development 和Operations的组合。DevOps 是一个面向IT运维的工作流,以及IT自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。 2、工作流 3、实现 DevOps 常用的工具 代码管理:GitHub、GitLab、SubVersion 构建工具:Ant、Gradle、maven 持续集成:Jenkins 容器:Docker 数据库:数据库:MySQL、Oracle、PostgreSQL等关系型数据库 测试:robot 质量检查:sonar 项目管理:Jira 4、基本介绍 4.1、核心 在我看来,DevOps 最大的核心就是持续集成,代码通过发布之后,经过 Jenkins 等的持续集成,经过检出、质量检查、编译、打包、测试、通知、确认发布之后,软件开发部署部分就完成了最核心的一部分。这部分就实现了开发人员与运维人员的交汇、开发人员可以只需要开发代码、并通过 Devops 发布部署到指定的节点上,同时,开发人员只需要提交代码就可以...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启