Redis分布式锁实现
redis分布式锁解决多个应用进程间同步操作
import java.util.List; import java.util.UUID;import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Transaction; import redis.clients.jedis.exceptions.JedisException;/*** Jedis实现分布式锁**/ public class DistributionLock {private final JedisPool jedisPool;public DistributionLock(JedisPool jedisPool) {this.jedisPool = jedisPool;}/*** 获取分布式锁* * @param lockName* 竞争获取锁key* @param acquireTimeoutInMS* 获取锁超时时间* @param lockTimeoutInMS* 锁的超时时间* @return 获取锁标识*/public String acquireLockWithTimeout(String lockName,long acquireTimeoutInMS, long lockTimeoutInMS) {Jedis conn = null;boolean broken = false;String retIdentifier = null;try {conn = jedisPool.getResource();String identifier = UUID.randomUUID().toString();String lockKey = "lock:" + lockName;int lockExpire = (int) (lockTimeoutInMS / 1000);long end = System.currentTimeMillis() + acquireTimeoutInMS;while (System.currentTimeMillis() < end) {if (conn.setnx(lockKey, identifier) == 1) {conn.expire(lockKey, lockExpire);retIdentifier = identifier;}if (conn.ttl(lockKey) == -1) {conn.expire(lockKey, lockExpire);}try {Thread.sleep(10);} catch (InterruptedException ie) {Thread.currentThread().interrupt();}}} catch (JedisException je) {if (conn != null) {broken = true;jedisPool.returnBrokenResource(conn);}} finally {if (conn != null && !broken) {jedisPool.returnResource(conn);}}return retIdentifier;}/*** 释放锁* @param lockName 竞争获取锁key* @param identifier 释放锁标识* @return*/public boolean releaseLock(String lockName, String identifier) {Jedis conn = null;boolean broken = false;String lockKey = "lock:" + lockName;boolean retFlag = false;try {conn = jedisPool.getResource();while (true) {conn.watch(lockKey);if (identifier.equals(conn.get(lockKey))) {Transaction trans = conn.multi();trans.del(lockKey);List<Object> results = trans.exec();if (results == null) {continue;}retFlag = true;}conn.unwatch();break;}} catch (JedisException je) {if (conn != null) {broken = true;jedisPool.returnBrokenResource(conn);}} finally {if (conn != null && !broken) {jedisPool.returnResource(conn);}}return retFlag;}}
参考:
http://www.cnblogs.com/wuhuajun/p/5242644.html
Redis分布式锁实现相关推荐
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...
- 快来学习Redis 分布式锁的背后原理
以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...
- Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...
- Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...
- 秒杀商品超卖事故:Redis分布式锁请慎用!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...
- 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...
- 简单介绍redis分布式锁解决表单重复提交的问题
在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...
- Redis 分布式锁没这么简单,网上大多数都有 bug
Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...
- 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!
阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...
- SpringBoot + Redis 分布式锁:模拟抢单
作者:神牛003 cnblogs.com/wangrudong003/p/10627539.html 本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使 ...
最新文章
- Python 开源项目 Top 10 精选(平均star为1128)
- 房住不炒,来真的了?
- hm55主板支持最大内存_内存频率取决于CPU还是主板?内存频率看主板支持还是看CPU支持?...
- Python命令行选项参数解析策略
- slice_input_producer在2.0版本里怎么用_微信提醒对方账号异常应该怎么办
- java的几_Java的几种时间
- 虚拟机下载和使用说明
- 缓冲区是人为设定的吗_人为的,但这真的是情报吗?
- 蓝桥杯-----历届试题 小数第n位
- PDF转HTML常用方法分享
- 5G版聚合路由器加速释放超高清视频传输应用
- 基于Hadoop的电商用户分析系统
- 基于Nginx搭建RTMP-HLS视频直播服务器(推流+拉流)
- 新手怎样安装win10系统?win10系统安装教程解读
- 【论文笔记】An End-to-End Model for QA over KBs with Cross-Attention Combining Global Knowledge
- 电脑赚钱兼职平台有哪些?分享几个正规靠谱的平台
- 命令行基础、目录和文件管理、教学环境介绍、
- 微信文件删除了怎么恢复,2个实测有效的办法推荐
- js原生alert弹框美化
- hbase shell 创建表