基于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分布式锁的配置和使用相关推荐

  1. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了

    作者 | 李祥    责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...

  2. springboot基础(72):Redisson分布式锁

    文章目录 前言 第一节 入门使用Redisson 第二节 注解形式的分布式锁 1. 分布式锁的注解实现 2. 分析MyRedissonLock注解和使用 传送门 前言 并发执行是比较场景的场景,单机情 ...

  3. Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

    Jmeter+Springboot+Redisson分布式锁并发订单操作(下单.取消单.完成单.加库存) 涉及知识点: java+springboot+mybatis开发 redis分布式锁+Redi ...

  4. Redis实战——Redisson分布式锁

    目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson 2.1 什么是Redisson 2.2 Redisson实现分布式锁快速入门 2.3 Redisson 可重入锁原理 什 ...

  5. redisson分布式锁,实战

    目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...

  6. Redisson分布式锁实现

    Redisson分布式锁实现 1. 分布式锁概述 2. 分布式锁实现 2.1 maven依赖 2.2 配置参数 2.3 代码实现 1. 分布式锁概述 程序中的锁就是为了解决临界资源访问的同步性问题,而 ...

  7. Redis:Redisson分布式锁的使用(推荐使用)

    Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...

  8. Redisson分布式锁

    目录 一.分布式锁 1.分布式锁的设计原则 2.分布式锁的实现方案 二.Redisson 三.Redisson分布式锁 1.引入Redisson依赖 2.配置Redis 3.注入RedissonCli ...

  9. Redisson分布式锁详解

    概述 setnx分布式锁的问题 重入问题 重入问题是指获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,它的方法都是使用synchroniz ...

最新文章

  1. 现代C++函数式编程
  2. 平庸开发者的生存指南
  3. 微软发布最新开源Blog平台“Oxite”
  4. 【java设计模式】迭代子模式
  5. Flask基础(03)--创建第一个Flask程序
  6. javascript 将table导出 Excel ,可跨行跨列
  7. 上传github代码
  8. 某公司PIX 520防火墙系统和NAT的实施
  9. 一个多文件编程里.h文件定义static变量产生的问题
  10. verilog 简单module_verilog简易教程
  11. win10进入pe模式系统的操作方法
  12. office2007每次打开都配置进度_解决Office2007每次启动时出现配置进度的问题
  13. xmanager 出现Initialize Flexnet Service failed / Error code: 50003
  14. js将人民币小写金额转换为大写
  15. 百度指数 爬虫 其实主要是破解
  16. SDNUOJ 1682.easy problem Ⅲ
  17. Java里面的Lambda表达式
  18. 第八天 字符串 流程控制(二)
  19. 如何使用MDK建立STM32H7双核编译工程
  20. ADB环境部署+ADB常见命令

热门文章

  1. quasi-Newton method 拟牛顿法
  2. 人工智能(A.I.)的几个常见基础定义及发展概述
  3. 新来的妹纸 rm -rf 把公司整个数据库删没了,整个项目组慌了~
  4. matlab错误的代码,matlab代码纠正错误
  5. python 面试题 阿里_最新阿里巴巴面试题(附带面试标准答案)
  6. 羊了个羊品牌域名情况如何?
  7. SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
  8. 连发 4 款处理器!面对苹果 AMD 的围堵,英特尔要改革 X86 了
  9. GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条
  10. 兼容IE浏览器下载文件