Springboot框架使用redisson实现分布式锁

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redisson是官方推荐的Java Redis客户端,提供丰富的功能,包括默认的分布式锁支持。它可以无缝替代Spring Boot 2.x的Letture客户端,不影响原有RedisTemplate和Redis Repository的使用。集成包括spring-boot-starter-data-redis和redisson-spring-boot-starter,后者需排除默认的redisson-spring-data-23以匹配Spring Data Redis v.2.2.x。

一、介绍Redisson

Redisson是Redis官方推荐的Java版的Redis客户端(Jedis、letture也是官方推荐的java版本redis客户端程序)。它提供的功能非常多,也非常强大,特别是它默认提供的分布式锁支持功能。其github源码仓库地址:https://github.com/redisson/redisson,包含多个子项目,对于我们本节比较有用的是

   集成redisson-spring-data-2x之后能够支持Spring Data redis及RedisTemplate

   集成redisson-spring-boot-starter能够支持Spring Cache(前提是已经集成spring-boot-starter-cache)

也就是说我们可以使用redisson无缝、无损的替换Spring Boot 2.x官方默认支持的redis客户端letture。也就是说我们之前学过的RedisTemplate、Redis Repository、Cache缓存该怎么用还怎么用,不受影响。

但是需要说明的是Redisson并不在Spring Boot官方默认支持的redis客户端的范围之内,所以redisson向Spring Boot 或者 Spring Data的集成方案,都是由redisson自己来维护的。

二、Spring Boot 集成Redisson

先从IDEA-maven管理Tab中查看,要确保自己的项目里面已经引入了下图所示的spring-boot-starter-data-redis。如何集成spring-boot-starter-data-redis,参考前面章节《单例、哨兵、集群模式整合》

如上所示,我们使用的是spring data 2.2.4版本,所以artifactId为redisson-spring-data-22。如果你使用的其他的版本,以此类推。

   <dependency>

        <groupId>org.redisson</groupId>

        <!-- for Spring Data Redis v.2.2.x -->

        <artifactId>redisson-spring-data-22</artifactId>

        <version>3.15.0</version>

    </dependency>

除此之外,还要加入核心jar包redisson-spring-boot-starter,我们使用的是3.15.0版本,其默认包含redisson-spring-data-23,和我们Spring Data Redis v.2.2.x不匹配,所以我们用exclusion把它排除掉。

   <dependency>

     <groupId>org.redisson</groupId>

     <artifactId>redisson-spring-boot-starter</artifactId>

     <version>3.15.0</version>

     <exclusions>

       <exclusion>

         <groupId>org.redisson</groupId>

         <!-- 默认是 Spring Data Redis v.2.3.x ,所以排除掉-->

         <artifactId>redisson-spring-data-23</artifactId>

       </exclusion>

     </exclusions>

   </dependency>

下面的这一步从我的实验来看,可做可不做,不影响。但是既然我们使用redisson替换lettuce,就不要把lettuce的jar留在项目里面了,把它也排除掉。

三、两种配置方法

3.1.配置方法一

redisson-spring-boot-starter默认支持application全局配置文件,redis配置以前怎么配置,现在还怎么配置,把lettuce段的配置去掉就可以了。

3.2.配置方法二

首先把全局配置文件中spring.redis下面的配置全都删除掉,然后加上redisson独立配置文件的指向位置及文件名称

   spring:

     redis:

       redisson:

         file: classpath:redisson.yaml

在resource目录下新建一个文件redisson.yaml,比如:redis单例模式的配置方法如下:

   哨兵模式、集群模式等更多配置参考:https://github.com/redisson/redisson/wiki/目录

   singleServerConfig:

     idleConnectionTimeout: 10000

     connectTimeout: 10000

     timeout: 3000

     retryAttempts: 3

     retryInterval: 1500

     password: 123456

     subscriptionsPerConnection: 5

     clientName: null

     address: "redis://192.168.161.3:6379"

     subscriptionConnectionMinimumIdleSize: 1

     subscriptionConnectionPoolSize: 50

     connectionMinimumIdleSize: 32

     connectionPoolSize: 64

     database: 0

     dnsMonitoringInterval: 5000

   threads: 0

   nettyThreads: 0

   codec: !<org.redisson.codec.JsonJacksonCodec> {}

   transportMode: "NIO"

大家可以看到第二种配置方案比第一种配置方案,多出很多细节方面的配置,更适合有经验的高手进行性能优化使用。

四、分布式锁的实现

仍然是老套路,获取锁、上锁锁定、业务代码执行完成释放锁。

   @Resource

   private RedissonClient redissonClient;

   

   public void updateUser(String userId) {

     String lockKey = "config" + userId;

     RLock lock = redissonClient.getLock(lockKey);  //获取锁资源

     try {

       lock.lock(10, TimeUnit.SECONDS);   //加锁,可以指定锁定时间

   

       //这里写需要处理业务的业务代码

     } finally {

       lock.unlock();   //释放锁

     }

   }

   相对于RedisLockRegistry另一个小优点是:我们可以为每一个锁指定锁定的超时时间。RedisLockRegistry目前只能针对所有的锁设定统一的超时时间

   如果业务执行超时之后,再去unlock会抛出java.lang.IllegalMonitorStateException

上面的用法可以满足你绝大部分的分布式锁的业务场景,更多的用法参考官方wiki:

https://github.com/redisson/redisson/wiki/8.-分布式锁和同步器


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
24天前
|
XML 安全 Java
|
1月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
27天前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
39 0
|
2天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
8天前
|
供应链 NoSQL Java
关于Redisson分布式锁的用法
Redisson分布式锁是实现分布式系统中资源同步的有效工具。通过合理配置和使用Redisson的各种锁机制,可以确保系统的高可用性和数据一致性。本文详细介绍了Redisson分布式锁的配置、基本用法和高级用法,并提供了实际应用示例,希望对您在实际项目中使用Redisson分布式锁有所帮助。c
51 10
|
7天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
34 2
|
9天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
27 5
|
20天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
49 8
|
23天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
41 3
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
51 6