在java中我们最常使用的加锁方式就是 synchronized关键字和各种 Lock锁,但是这种方式加的锁只能保证在单项目或者说同一个jvm中起作用.但是在现在的分布式环境下就不能很好的应对分布式环境的加锁需求,所以有了分布式锁

  • 分布式锁:

分布式锁就是一种思想,指的是能在分布式环境中,在多个地方使用一个锁的时候,保证只能同时有一个持锁对象.一般是加锁的地方由常规的java的锁,变成 第三方组件或工具实现(比如:redis,memcached,基于数据库的实现,zookeeper 等等)

redis 的实现


一般过程分为:加锁,解锁

  • 加锁:

一般是通过 NX(即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作) 命令,设置 一个key (一般会以为某个系统用的参数) ,和一个随机字符串(即设置的key对应的value),和(PX)超时时间, 命令如下: SET key value NX PX 2000

  • 解锁

解锁的过程就是安全删除这个key的过程,通过对当前的锁持有的字符串和 redis中的key的锁值进行匹配,如果配对则可以移除;或者超过超时时间,锁也会自动退出被其他线程使用

  • 环境

使用的是 jedis 2.9.0

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>复制代码

代码实现


说明:一般设置分布式锁的时候,比如:金额操作会在多个地方,使用同一个key比如用户账号,这个时候如果没获取到锁,肯定不如直接返回报错或异常或者直接结束,应该有个重试竞争机制


/*** @param jedis             jedis 连接* @param lockKey           传入的锁标识* @param tryTimeoutMs      尝试获取锁的时间* @param lockTimeoutMS     锁的超时时间* @return                  返回设置key对应的value值*/public static String lock(Jedis jedis,String lockKey, long tryTimeoutMs, int lockTimeoutMS) {String retTip = null;String identifier = UUID.randomUUID().toString();try {long end = System.currentTimeMillis() + tryTimeoutMs;while (System.currentTimeMillis() < end) {String result = jedis.set(lockKey, identifier, "NX", "PX", lockTimeoutMS);if ("OK".equals(result)) {retTip = identifier;break;}try {Thread.sleep(10);} catch (InterruptedException ie) {Thread.currentThread().interrupt();}}} catch (Exception e) {return "err";} finally {// 异常释放连接if (jedis != null) {jedis.close();}}return retTip;}复制代码
  • 重试调用和释放锁的例子

// 调用,循环多次尝试获取锁**Java面试核心知识点笔记**其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/cca8e7893b62cb259275a0395ee569eb.png)**Java中高级面试高频考点整理**![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/f66d5e1f5c7d46e5c16860c28c77dc6b.png)**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/503c4c46126c8631938c92a2feb767bc.png)**最后分享Java进阶学习及面试必备的视频教学**![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/a41cc37f0d1025a196b2d8c92e185c45.png)
+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**[外链图片转存中...(img-Mh7JkQwR-1631069576812)]**最后分享Java进阶学习及面试必备的视频教学**[外链图片转存中...(img-BcPeleFv-1631069576814)]

redis分布式锁实现与思考,阿里P8架构师的Java大厂面试题总结相关推荐

  1. 安卓交流社区!阿里P8架构师的Android大厂面试题总结,详细的Android学习指南

    面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年Android开发经验,简历上写着精通Java,Android,熟悉H5开发.没有具体的技术点. 说实话我很期待这位老哥的 ...

  2. 安卓开发论坛!阿里P8架构师的Android大厂面试题总结,附赠课程+题库

    写这篇文章的目的是想说说这段时间一直被不断提起搞得人心惶惶的话题,裁员.为什么突然聊这个,本来一直是想避开这个话题的,一是网上已经有了铺天盖地的消息不想要再造成大家的恐慌,二是我身边几乎没有发生这样的 ...

  3. 阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

    常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视.很多技术人员拿到一个性能优化的需求以后,言必称缓存.异步.JVM等.实际上,第一步就应该是分析相关的代码, ...

  4. 阿里P8架构师谈:分布式、集群、负载均衡、分布式数据一致性的区别与关联

    服务器集群: 1.集群概念 集群就是一组相互独立的计算机,通过高速的网络组成一个计算机系统.服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器. 2.集群的特点和 ...

  5. 阿里P8架构师谈:分布式事务的解决方案,以及原理、总结

    分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍. 事务 1. ...

  6. 阿里P8架构师谈:MongoDB、Hbase、Redis等NoSQL优劣势、应用场景

    NoSQL的四大种类 NoSQL数据库在整个数据库领域的江湖地位已经不言而喻.在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心,无法应对很多数 ...

  7. 阿里P8架构师谈:分布式架构设计12精讲

    分布式架构设计包含: 分布式缓存 分布式消息中间件 分库分表.读写分离 单点登录等 想成为阿里160万年薪的P8架构师?你必须掌握如下6大技能体系! 阿里P8架构师谈:分布式架构系统拆分原则.需求.微 ...

  8. 阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用

    我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突).如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从 ...

  9. 阿里P8架构师进阶心得:分布式数据库架构MyCat学习笔记送给你

    前言: MyCat 是一个数据库分库分表中间件,使用 MyCat 可以非常方便地实现数据库的分库分表查询,并且减少项目中的业务代码.今天我们将通过数据库架构发展的演变来介绍 MyCat 的诞生背景,以 ...

最新文章

  1. 山东计算机类好的民办大学,山东四大坑人学校-山东坑人的民办大学(野鸡大学)...
  2. linux iptables扩展,脚本防火墙
  3. 通过Fiddler进行手机抓包
  4. GCC Inline ASM GCC内联汇编
  5. 他们调查了3.9万名程序员,制作了这份开发者技能报告
  6. Ubuntu 安装 Linux Deepin 截图工具(.deb)
  7. Java 数组操作
  8. 服务端渲染SSR的理解
  9. 华为云推出新冠肺炎AI辅助诊断服务,CT量化结果秒级输出
  10. php前后端分离两个域名访问,Laravel 5.4前后台分离,通过不同的二级域名访问方法...
  11. 三分钟看Netty(3) select poll VS epoll
  12. \045在字符串中输出为%
  13. strictmode
  14. TB6612FNG 驱动学习笔记
  15. java测试vss_VSS项目分支
  16. Nginx中传输带宽限制
  17. 联想LENOVO K2450升级(或全新安装)Windows 10后不能正常关机的解决方案
  18. -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)
  19. 台式启动修复无法自动修复此计算机怎么办,如果win7启动修复无法自动修复此计算机怎么办...
  20. Keras Image Data Augmentation 各参数详解

热门文章

  1. GIF动态图怎么提取成图片?分享三个动态图提取成图片的方法
  2. 工程师和程序员的区别
  3. 就业指导:电脑工程师的需求分析和就业指导
  4. java投屏 dlna 安卓_DLNA投屏,支持IOS和安卓
  5. Android N 多窗口布局 省电模式 全新通知功能
  6. 为什么华为要实行轮值CEO制度呢?
  7. permission 文档 翻译 运行时权限
  8. 凸多边形对角线交点问题
  9. linux搭建个人私有云存储系统nextcloud(记录操作全过程)
  10. RZGO-A, HZGO-A,KZGO-A控制阿托斯比例减压阀控制器