




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Redis的分布式分布式锁一般有三种实现方Redis的分布式分布式锁一般有三种实现方ZooKeeper的分布式基于关系数据库乐观基于关系数据库实现分布式锁主要利用数据库的锁机制,通常使用乐观锁。但是由于并发场景下RDBMS的IO开销太大,所以一般不适用与大型、高并发项目ZooKeeper基于ooeper临时有序节点实现的分布式锁,其大致思想为:每个客户端获取锁时,在ookeperzkhpblo.csdnne/heopcRedis的分布式本篇主要介绍使用redis构建分布式锁服redis实现分布式锁主要Redissetnx命SETNXkeyvalrediskey不存在时,setkeyvalkey存在,则什么都不做,返回0expirekeykeysecondredis会自动删除该键值对,即锁rediskey,即释放在使用Redisrediskey,即释放在使用Redis实现分布式锁的时候,主要就会使用到这三个命令1、获取锁的时候setnx加锁,并使expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值需要指定,可以根据具有业务含义,本文简化为UUID,在2、获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁3、释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放Maven依赖信packagecom.zpc.redis.lock;importredis.clients.jedis.Jedis;importjava.util.UUID;publicclassRedisLockprivateJedisPoolpublicRedisLock(JedisPoolprivateJedisPoolpublicRedisLock(JedisPool{this.jedisPool=}*@param@param@parampublicStringlock(StringlockKey,LongacquireTimeout,Long{Jedisconn=StringreturnedLockId=tryconn=StringlockName="redis_lock_"+3.定义上锁成功之后,锁的超时时间intexpireTimeinttimeOutStringlockId=UUID.randomUUID().toString().replaceAll("-",//LongendTime=System.currentTimeMillis()+acquireTimeout;while(System.currentTimeMillis()<endTime){6.使用setnxif(conn.setnx(lockName,lockId)==1)conn.expire(lockName,expireTime);returnreturnedLockId;}//}}catch(Exception{}finallyif(conn!=packageimportcom.zpc.redis.lock.RedisLock;packageimportcom.zpc.redis.lock.RedisLock;import}}return}*publicbooleanreleaseLock(StringlockKey,StringlockId)Jedisconn=null;try{conn=StringlockName="redis_lock_"+3.如果valueredisifflag=true;System.out.println("releaselock:"+}}catch(Exception{}finallyif(conn!={}}return}importpublicclassRedisLockDemoprivatestaticJedisPoolimportpublicclassRedisLockDemoprivatestaticJedisPoolstaticJedisPoolConfigconfig=new//////config.setMaxWaitMillis(1000*//pool=newJedisPool(config,"",6379,}privatestaticRedisLockredisLock=newpublicstaticvoidmain(String[]{for(inti=0;i<50;i++)}}}classThreadRedisextendsThreadprivateRedisLock{this.redisLock=}publicvoidrun()try{identifier=redisLock.lock("foodLock",3000L,1000*60*redis测试,控制redis测试,控制台输出如下,发现超过3s钟获取锁失败Thread-46获取锁成功,id执行业务逻辑releaseThread-46释放锁成功,idThread-40获取锁成功,id执行业务逻辑releaseThread-40释放锁成功,idThread-19获取锁成功,id执行业务逻辑releaseThread-19释放锁成功,idThread-49获取锁成功,idif(StringUtils.isEmpty(identifier))//}System.out.println(Thread.currentThread().getName"获取锁成功,锁ididentifier:Thread.sleep(300);//模拟业务处理耗}catch(Exceptione)}finally//if(!StringUtils.isEmpty(identifier))if(releaseLock){System.out.println(Thread.currentThread().getName"释放锁成功,锁ididentifier:identifier+}}}}}执行业务逻辑release执行业务逻辑releaseThread-49释放锁成功,idThread-13获取锁成功,id执行业务逻辑releaseThread-13释放锁成功,idThread-20获取锁成功,id执行业务逻辑releaseThread-20释放锁成功,idThread-1获取锁成功,id执行业务逻辑releaseThread-1释放锁成功,idThread-22获取锁成功,id执行业务逻辑releaseThread-22释放锁成功,idThread-33获取锁成功,id执行业务逻辑releaseThread-33释放锁成功,idThread-23获取锁成功,id执行业务逻辑releaseThread-23释放锁成功,id都有很大的影响,本文实现的分布式锁只是一种简单的实现,主要学三种分布式对上面几种方式,哪种方式都无法做到完美。正如 定理一样,在复杂性、可用性分区容错性等方面无法同时满足,所以要根据不同的应用场景选择最从理解的难易程度角度(从低到高>>从实现的复>>从实现的复杂性角度(从低到高Zookeeper>=>从性能角度(从高到低>Zookeeper>=从可靠性角度(从高到低Zookeeper>>Redis实现分布式锁Zookeeper实现分布式锁区redis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中数学第5章 图形的轴对称同步单元达标测试题+2024-2025学年北师大版七年级数学下册
- 全方位解析装液氮的容器原理、操作、维护与应用拓展
- 2《我向国旗敬个礼》公开课一等奖创新教学设计(表格式)-2
- 标准自行车零件采购合同
- 简易不锈钢材料采购合同版本
- 房屋买卖合同修订协议
- 三方合同:资源共享与互惠互利
- 会员卡转让合同模板
- 2025年医疗器械购销合同样本
- 事业单位劳动合同中的劳动权益保护
- 15j403-1楼梯栏杆标准
- 2024年03月湖南省韶山思政教育实践中心2024年招考5名合同聘用制教师笔试历年高频考题(难、易错点荟萃)答案带详解附后
- 2024-2025年全国初中化学竞赛试卷及答案
- 电力各种材料重量表总
- 《岩浆岩岩石学》课件
- (完整文档版)CRF表
- 广东深圳市道路交通管理事务中心招考聘用员额制工作人员笔试历年高频考点试题含答案带详解
- 家长会课件:四下英语家长会优质课件
- 癌症医疗保险(2021版)
- 工作危害分析(JHA)(起重作业)
- 幼儿认识警察ppt
评论
0/150
提交评论