Redisson分布式锁的配置和使用
基于springBoot的redisson分布式锁
之前使用Redis分布式锁都是自己写的工具类,利用Redis的setNX特性;后来发现Redisson提供的分布式锁是真的好用。
Redisson可以看做是对Redis的一个操作工具类。将原生的RedisHash,List,Set,String等数据结构封装为Java里大家最熟悉的映射(Map),列表(List),集(Set)等。
我的项目中使用了RedisTemplate,现在要在此基础上使用Redisson,如果再在配置文件里面添加一份Redisson的配置,那维护起来就非常麻烦,如果改动了配置信息,就要改动两个地方的配置。所以写一个RedissonConfig配置类,在配置里面读取RedisTemplate的配置信息即可;
一、配置文件
1.pom文件添加依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.1</version></dependency>
2.yml配置文件配置
springredis:database: 0host: 1.1.1.1port: 6379password: 123456cluster:nodes: 1.1.1.1:6379, 1.1.1.1:6379, 1.1.1.1:6379, 1.1.1.1:6379, 1.1.1.1:6379
二、RedisTemplate序列化配置
// 配置序列化@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();redisConnectionFactory.setDatabase(1);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setConnectionFactory(redisConnectionFactory);return template;}
三、RedissonConfig配置
@ConfigurationProperties(prefix = "spring.redis")
@Component
@Data
public class RedissonConfig {// 读取配置文件里面的Redis信息private String password;private Cluster cluster;public static class Cluster {private List<String> nodes;public List<String> getNodes() {return nodes;}public void setNodes(List<String> nodes) {this.nodes = nodes;}}/*** 配置redisson* @return*/@Beanpublic Redisson redisson() {List<String> clusterNodes = new ArrayList<>();for (int i = 0; i < this.getCluster().getNodes().size(); i++) {clusterNodes.add("redis://" + this.getCluster().getNodes().get(i));}Config config = new Config();ClusterServersConfig clusterServersConfig = config.useClusterServers().addNodeAddress(clusterNodes.toArray(new String[clusterNodes.size()]));clusterServersConfig.setPassword(getPassword());return (Redisson) Redisson.create(config);}}
四、编写RedissonUtil工具类
@Component
public class RedissonUtil {private static final Logger logger = LoggerFactory.getLogger(RedissonUtil.class);/*** redis锁前缀*/public static final String SYS_LOCK_FLAG = "MY_LOCK";/*** 用于隔开缓存前缀与缓存键值*/public static final String KEY_SPLIT = ":";// 静态属性注入private static Redisson redisson;@Autowiredpublic void setRedisson(Redisson redisson) {RedissonUtil.redisson = redisson;}/*** 加锁** @param lockName 锁名 相同的key表示相同的锁,建议针对不同的业务使用不同的key* @param expiresTime 过期时间,单位:秒* @return*/public static boolean getLock(String lockName, long expiresTime) {String key = getLockKey(lockName);//获取锁对象RLock lock = redisson.getLock(key);//设置锁过期时间,防止死锁的产生lock.lock(expiresTime, TimeUnit.SECONDS);logger.info("获取锁成功,Redis Lock key :{}", key);return true;}/*** 释放锁,建议放在 finally里面** @param lockName 锁名称*/public static void unlock(String lockName) {String key = getLockKey(lockName);//获取所对象RLock lock = redisson.getLock(key);// 释放锁,判断要解锁的key是否已被锁定并且是否被当前线程保持if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();logger.info("释放Redis锁成功,key:{}", key);}}/*** 对锁的key添加系统标识前缀** @return*/private static String getLockKey(String key) {return RedissonUtil.SYS_LOCK_FLAG + RedissonUtil.KEY_SPLIT + key;}}
五、使用
@Testpublic void redissonLock(){String key = "zhh11";long expiresTime = 10;// 加锁if (RedissonUtil.getLock(key,expiresTime)){try{Thread.sleep(3000L);// 业务代码}catch (Exception e){e.printStackTrace();}finally {// 释放锁RedissonUtil.unlock(key);// 捕获异常之后需要 手动回滚事务// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}}else {System.out.println("未获取到锁");}}
Redisson分布式锁的配置和使用相关推荐
- 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了
作者 | 李祥 责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...
- springboot基础(72):Redisson分布式锁
文章目录 前言 第一节 入门使用Redisson 第二节 注解形式的分布式锁 1. 分布式锁的注解实现 2. 分析MyRedissonLock注解和使用 传送门 前言 并发执行是比较场景的场景,单机情 ...
- Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)
Jmeter+Springboot+Redisson分布式锁并发订单操作(下单.取消单.完成单.加库存) 涉及知识点: java+springboot+mybatis开发 redis分布式锁+Redi ...
- Redis实战——Redisson分布式锁
目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson 2.1 什么是Redisson 2.2 Redisson实现分布式锁快速入门 2.3 Redisson 可重入锁原理 什 ...
- redisson分布式锁,实战
目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...
- Redisson分布式锁实现
Redisson分布式锁实现 1. 分布式锁概述 2. 分布式锁实现 2.1 maven依赖 2.2 配置参数 2.3 代码实现 1. 分布式锁概述 程序中的锁就是为了解决临界资源访问的同步性问题,而 ...
- Redis:Redisson分布式锁的使用(推荐使用)
Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...
- Redisson分布式锁
目录 一.分布式锁 1.分布式锁的设计原则 2.分布式锁的实现方案 二.Redisson 三.Redisson分布式锁 1.引入Redisson依赖 2.配置Redis 3.注入RedissonCli ...
- Redisson分布式锁详解
概述 setnx分布式锁的问题 重入问题 重入问题是指获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,它的方法都是使用synchroniz ...
最新文章
- 现代C++函数式编程
- 平庸开发者的生存指南
- 微软发布最新开源Blog平台“Oxite”
- 【java设计模式】迭代子模式
- Flask基础(03)--创建第一个Flask程序
- javascript 将table导出 Excel ,可跨行跨列
- 上传github代码
- 某公司PIX 520防火墙系统和NAT的实施
- 一个多文件编程里.h文件定义static变量产生的问题
- verilog 简单module_verilog简易教程
- win10进入pe模式系统的操作方法
- office2007每次打开都配置进度_解决Office2007每次启动时出现配置进度的问题
- xmanager 出现Initialize Flexnet Service failed / Error code: 50003
- js将人民币小写金额转换为大写
- 百度指数 爬虫 其实主要是破解
- SDNUOJ 1682.easy problem Ⅲ
- Java里面的Lambda表达式
- 第八天 字符串 流程控制(二)
- 如何使用MDK建立STM32H7双核编译工程
- ADB环境部署+ADB常见命令
热门文章
- quasi-Newton method 拟牛顿法
- 人工智能(A.I.)的几个常见基础定义及发展概述
- 新来的妹纸 rm -rf 把公司整个数据库删没了,整个项目组慌了~
- matlab错误的代码,matlab代码纠正错误
- python 面试题 阿里_最新阿里巴巴面试题(附带面试标准答案)
- 羊了个羊品牌域名情况如何?
- SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
- 连发 4 款处理器!面对苹果 AMD 的围堵,英特尔要改革 X86 了
- GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条
- 兼容IE浏览器下载文件