redis分布式锁工具类
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分布式锁工具类相关推荐
- RedissonDistributedLock(redis分布式锁工具类,笔记)
redisson分布式锁, 支持全局与局部锁 RedissonDistributedLock package com.llb.cloudyoung.tool.lock;import com.llb.c ...
- java分布式锁工具类_java 通过redis实现分布式锁
1. 开局 在多线程环境中,经常会碰到需要加锁的情况,由于现在的系统基本都是集群分布式部署,JVM的lock已经不能满足分布式要求,分布式锁就这样产生了... 百度一下,网上有很多分布式锁的方案或者例 ...
- 面试官问我,Redis分布式锁如何续期?懵了。
作者:肥朝,来自:肥朝(ID:feichao_java) 前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的老粉丝 ...
- Redis分布式锁的原理以及如何续期
面试问题 Redis锁的过期时间小于业务的执行时间该如何续期? 问题分析 首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So easy.我们来看 很多同学在用分布 ...
- 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我
1|0背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件.不得不说,做组件的大牛对CRUD操作的封装,连接池.缓存路由.缓存安全性的管控都处理的无可挑剔.但是有一个小问题,该组件没有对分布式 ...
- redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?
Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:wangzaiplus 来源:https://www.jianshu.com/u/8cb4591440ca 一.前言 关 ...
- Redis分布式锁实战
背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件.不得不说,做组件的大牛对CRUD操作的封装,连接池.缓存路由.缓存安全性的管控都处理的无可挑剔.但是有一个小问题,该组件没有对分布式锁做实 ...
- redis续期_面试官:Redis分布式锁如何解决锁超时问题的?
一.前言 关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完的问题, 这样会导致: A线程超时时间设为10s(为了解决死锁问题 ...
- 以商品超卖为例讲解Redis分布式锁
本案例主要讲解Redis实现分布式锁的两种实现方式:Jedis实现.Redisson实现.网上关于这方面讲解太多了,小编自认为文笔没他们好,还是用示例代码说明. 一.jedis 实现 该方案只考虑Re ...
最新文章
- R语言在直方图条(柱形)上添加计数(count)或者百分比(percent)标签
- linux环境下安装tomcat6
- Firefox 插件:鲜味 del.icio.us,和朋友分享你的收藏
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
- 中科大 计算机网络8 协议层次和服务模型
- git lfs mac 安装_mac安装homebrew
- elementUI 学习入门之 Button 按钮
- [Python] 字符串大写变小写 lower()函数
- IPython在Windows 7上的搭建步骤
- C++基本语法简介,C++程序简介
- unity常用的引用赋值一个GameObject的三种方法
- Unity3D方向键控制人物移动的代码
- vue模板解析——源码演示
- 双硬盘安装双系统详解
- 证书错误 SSLCertVerificationError
- representation learning的理解
- 【iOS】Ineligible Devices || “无法下载应用程序”
- sqlmap--tamper使用技巧
- waf防火墙是什么?有什么作用
- Linux——chmod命令用法
热门文章
- 医学图像分割的半监督学习综述
- 十分钟带你了解XXE
- ARFoundation入门到精通 - 1.3 ARkit 支持机型
- NCTF2022 calc题目复现
- [网络安全学习篇13]:IP包头分析与路由原理及实验(千峰网络安全视频笔记 13 day)
- zabbix基于SNMP 协议监控路由器
- 状态机 Stateless VS StateMachine
- Unity实现物体逐渐消失
- 2023 QS世界大学学科排名:中国大陆高校有32个学科进入世界前20,材料科学、化学、生物科学等表现优异 | 美通社头条...
- JVM 系列(二) --- JVM 类加载的基本流程