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分布式锁实现相关推荐

  1. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...

    在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...

  2. 快来学习Redis 分布式锁的背后原理

    以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...

  3. Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...

  4. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...

  5. 秒杀商品超卖事故:Redis分布式锁请慎用!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...

  6. 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...

  7. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  8. Redis 分布式锁没这么简单,网上大多数都有 bug

    Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写? 因为看过很多文章没有将分布式锁的各种问题讲明白,所以准备写一篇,也当做自己的学习总结. 在进入正文之前,我 ...

  9. 深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

    ‍‍‍‍‍‍‍‍‍‍‍‍阅读本文大约需要 20 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题. Redis 分布式锁的话题,很多文章已经写烂了 ...

  10. SpringBoot + Redis 分布式锁:模拟抢单

    作者:神牛003 cnblogs.com/wangrudong003/p/10627539.html 本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使 ...

最新文章

  1. Python 开源项目 Top 10 精选(平均star为1128)
  2. 房住不炒,来真的了?
  3. hm55主板支持最大内存_内存频率取决于CPU还是主板?内存频率看主板支持还是看CPU支持?...
  4. Python命令行选项参数解析策略
  5. slice_input_producer在2.0版本里怎么用_微信提醒对方账号异常应该怎么办
  6. java的几_Java的几种时间
  7. 虚拟机下载和使用说明
  8. 缓冲区是人为设定的吗_人为的,但这真的是情报吗?
  9. 蓝桥杯-----历届试题 小数第n位
  10. PDF转HTML常用方法分享
  11. 5G版聚合路由器加速释放超高清视频传输应用
  12. 基于Hadoop的电商用户分析系统
  13. 基于Nginx搭建RTMP-HLS视频直播服务器(推流+拉流)
  14. 新手怎样安装win10系统?win10系统安装教程解读
  15. 【论文笔记】An End-to-End Model for QA over KBs with Cross-Attention Combining Global Knowledge
  16. 电脑赚钱兼职平台有哪些?分享几个正规靠谱的平台
  17. 命令行基础、目录和文件管理、教学环境介绍、
  18. 微信文件删除了怎么恢复,2个实测有效的办法推荐
  19. js原生alert弹框美化
  20. hbase shell 创建表

热门文章

  1. webpack从零开始第2课: 配置文件
  2. shell字符串截取总结
  3. [编程技巧] 巧用CPU缓存优化代码:数组 vs. 链表
  4. uva-11111-栈
  5. Oracle 分析函数--Row_Number()
  6. 数据库密码加密 使用的是 druid加密
  7. Nginx加入linux系统服务
  8. linux学习blog
  9. s3c6410 uboot代码分析《一》
  10. Web Control 开发系列(三) 解析IPostBackEventHandler和WebForm的事件机制