import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;import java.util.concurrent.TimeUnit;/*** 并发工具类* author: zhanggw* 创建时间:  2021/1/19*/
public class ConcurrentUtils {private static final Logger logger = LoggerFactory.getLogger(ConcurrentUtils.class);/*** <一句话功能简述> 获取redis分布式锁* <功能详细描述> 建议业务处理后及时清理锁(freeRedisLock);若不及时清理则需等到超时删除* author: zhanggw* 创建时间:  2021/1/19* @param redisLockKey redis锁名称,不能重复* @return boolean true:获取锁成功,false:获取失败*/public static boolean getRedisLock(RedisTemplate<String, String> redisTemplate,String redisLockKey){try{int sleepMiniTime = 100; // 循环等待最小间隔时间for(int i=0; i < 50; i++) { // 最多尝试50次获取锁Boolean unLockFlag = redisTemplate.opsForValue().setIfAbsent(redisLockKey, redisLockKey, 3, TimeUnit.SECONDS);if(unLockFlag != null && unLockFlag){ // 获取分布式锁成功logger.debug("获取redis锁{}成功", redisLockKey);return true;}else{ // 获取分布式锁失败Thread.sleep(sleepMiniTime);}}}catch (Exception e){logger.error("获取redis锁异常!", e);}return false;}/*** <一句话功能简述> 获取redis分布式锁* <功能详细描述> 建议业务处理后及时清理锁(freeRedisLock);若不及时清理则需等到超时删除* author: zhanggw* 创建时间:  2021/12/1* @param redisLockKey redis锁名称* @param timeout 获取分布式锁的最大等待时间* @param redisTimeout redis锁超时时间,单位分钟* @return boolean true:获取到锁,false:未获取到锁*/public static boolean getRedisLock(RedisTemplate<String, String> redisTemplate,String redisLockKey, int timeout, int redisTimeout){try{int sleepMiniTime = 100; // 循环等待最小间隔时间if(timeout < 100){timeout = sleepMiniTime;}for(int i=0; i < timeout/sleepMiniTime; i++) { // 自旋,在获取锁超时前,循环尝试获取Boolean unLockFlag = redisTemplate.opsForValue().setIfAbsent(redisLockKey, redisLockKey, redisTimeout, TimeUnit.MINUTES); // 上锁if(unLockFlag != null && unLockFlag){ // 获取锁成功logger.debug("获取redis锁{}成功", redisLockKey);return true;}else{ // 未获取到分布式锁,等待sleepMiniTimeThread.sleep(sleepMiniTime);}}}catch (Exception e){logger.error("获取redis分布式锁异常!", e);}return false;}/*** <一句话功能简述> 判断是否唯一运行* <功能详细描述> 利用redis分布式锁* author: zhanggw* 创建时间:  2021/12/1* @param redisLockKey redis key* @param timeout redis key超时时间,单位毫秒* @return boolean true:唯一运行 false:非唯一运行*/public static boolean isUniqueRun(RedisTemplate<String, String> redisTemplate,String redisLockKey, int timeout){try{Boolean unLockFlag = redisTemplate.opsForValue().setIfAbsent(redisLockKey, redisLockKey, timeout, TimeUnit.MILLISECONDS); // 上锁if(unLockFlag != null && unLockFlag){ // 唯一运行return true;}}catch (Exception e){logger.error("判断唯一运行异常!", e);}return false;}/*** <一句话功能简述> 判断是否唯一运行* <功能详细描述> 利用redis分布式锁* author: zhanggw* 创建时间:  2021/12/1* @param redisLockKey redis key* @param timeout redis key超时时间* @param timeUnit 超时时间单位* @return boolean true:唯一运行 false:非唯一运行*/public static boolean isUniqueRun(RedisTemplate<String, String> redisTemplate,String redisLockKey, int timeout, TimeUnit timeUnit){try{Boolean unLockFlag = redisTemplate.opsForValue().setIfAbsent(redisLockKey, redisLockKey, timeout, timeUnit); // 上锁if(unLockFlag != null && unLockFlag){ // 唯一运行return true;}}catch (Exception e){logger.error("判断唯一运行异常!", e);}return false;}/*** <一句话功能简述> 清理redis锁* <功能详细描述> * author: zhanggw* 创建时间:  2021/1/19* @param redisTemplate redis连接* @param redisLockKey redis key锁名称*/public static void freeRedisLock(RedisTemplate<String, String> redisTemplate,String redisLockKey){redisTemplate.delete(redisLockKey);logger.debug("已清理redis锁{}", redisLockKey);}}

redis分布式锁工具类相关推荐

  1. RedissonDistributedLock(redis分布式锁工具类,笔记)

    redisson分布式锁, 支持全局与局部锁 RedissonDistributedLock package com.llb.cloudyoung.tool.lock;import com.llb.c ...

  2. java分布式锁工具类_java 通过redis实现分布式锁

    1. 开局 在多线程环境中,经常会碰到需要加锁的情况,由于现在的系统基本都是集群分布式部署,JVM的lock已经不能满足分布式要求,分布式锁就这样产生了... 百度一下,网上有很多分布式锁的方案或者例 ...

  3. 面试官问我,Redis分布式锁如何续期?懵了。

    作者:肥朝,来自:肥朝(ID:feichao_java) 前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的老粉丝 ...

  4. Redis分布式锁的原理以及如何续期

    面试问题 Redis锁的过期时间小于业务的执行时间该如何续期? 问题分析 首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So easy.我们来看 很多同学在用分布 ...

  5. 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我

    1|0背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件.不得不说,做组件的大牛对CRUD操作的封装,连接池.缓存路由.缓存安全性的管控都处理的无可挑剔.但是有一个小问题,该组件没有对分布式 ...

  6. redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:wangzaiplus 来源:https://www.jianshu.com/u/8cb4591440ca 一.前言 关 ...

  7. Redis分布式锁实战

    背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件.不得不说,做组件的大牛对CRUD操作的封装,连接池.缓存路由.缓存安全性的管控都处理的无可挑剔.但是有一个小问题,该组件没有对分布式锁做实 ...

  8. redis续期_面试官:Redis分布式锁如何解决锁超时问题的?

    一.前言 关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完的问题, 这样会导致: A线程超时时间设为10s(为了解决死锁问题 ...

  9. 以商品超卖为例讲解Redis分布式锁

    本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现.Redisson实现.网上关于这方面讲解太多了,小编自认为文笔没他们好,还是用示例代码说明. 一.jedis 实现 该方案只考虑Re ...

最新文章

  1. R语言在直方图条(柱形)上添加计数(count)或者百分比(percent)标签
  2. linux环境下安装tomcat6
  3. Firefox 插件:鲜味 del.icio.us,和朋友分享你的收藏
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
  5. 中科大 计算机网络8 协议层次和服务模型
  6. git lfs mac 安装_mac安装homebrew
  7. elementUI 学习入门之 Button 按钮
  8. [Python] 字符串大写变小写 lower()函数
  9. IPython在Windows 7上的搭建步骤
  10. C++基本语法简介,C++程序简介
  11. unity常用的引用赋值一个GameObject的三种方法
  12. Unity3D方向键控制人物移动的代码
  13. vue模板解析——源码演示
  14. 双硬盘安装双系统详解
  15. 证书错误 SSLCertVerificationError
  16. representation learning的理解
  17. 【iOS】Ineligible Devices || “无法下载应用程序”
  18. sqlmap--tamper使用技巧
  19. waf防火墙是什么?有什么作用
  20. Linux——chmod命令用法

热门文章

  1. 医学图像分割的半监督学习综述
  2. 十分钟带你了解XXE
  3. ARFoundation入门到精通 - 1.3 ARkit 支持机型
  4. NCTF2022 calc题目复现
  5. [网络安全学习篇13]:IP包头分析与路由原理及实验(千峰网络安全视频笔记 13 day)
  6. zabbix基于SNMP 协议监控路由器
  7. 状态机 Stateless VS StateMachine
  8. Unity实现物体逐渐消失
  9. 2023 QS世界大学学科排名:中国大陆高校有32个学科进入世界前20,材料科学、化学、生物科学等表现优异 | 美通社头条...
  10. JVM 系列(二) --- JVM 类加载的基本流程