一、介绍Redisson

Redisson是Redis官方推荐的Java版的Redis客户端(Jedis、letture也是官方推荐的java版本redis客户端程序)。它提供的功能非常多,也非常强大,特别是它默认提供的分布式锁支持功能。其github源码仓库地址:GitHub - redisson/redisson: Redisson - Redis Java client with features of In-Memory Data Grid. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Publish / Subscribe, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, MyBatis, RPC, local cache ...,包含多个子项目,对于我们本节比较有用的是

  • 集成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: 10000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500password: 123456subscriptionsPerConnection: 5clientName: nulladdress: "redis://192.168.161.3:6379"subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50connectionMinimumIdleSize: 32connectionPoolSize: 64database: 0dnsMonitoringInterval: 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

springboot整合redisson实现分布式锁相关推荐

  1. 整合redisson了解分布式锁的配置熟悉lock的看门狗机制以及应用

    java相对主流分布式锁 - redis的Redisson (Java implementation) the Redlock 设计 1.引入依赖 <!-- https://mvnreposit ...

  2. springboot整合redis实现分布式锁思想

    思路 所有响应获取锁的线程都先尝试往redis中创建一个缓存数据,所有线程的key必须相同.使用的是redis的setnx命令.就只有一个线程能够创建成功,创建成功的线程就成功获取锁. 没有获取锁的线 ...

  3. springboot整合curator实现分布式锁模拟抢购场景

    文章目录 1.环境说明 2.maven依赖 3.代码实现 3.1.Redis 3.1.1.配置文件 3.1.2.redisTemplate配置 3.2.Curator 3.1.1.配置文件 3.1.2 ...

  4. SpringBoot使用Redisson实现分布式锁秒杀

    本篇文章采用的是单机模式,具体可以参考官网redisson介绍. Redisson源码分析 Redisson实现了Lock接口,对比Lock而言,是可重入锁,功能强大,源码复杂. 加锁 用代码举例子 ...

  5. springboot整合curator实现分布式锁

    理论篇: Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处 ...

  6. springboot整合redisson实现多种分布式锁

    Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式 ...

  7. SpringBoot整合redisson分布式锁

    1.为什么要使用分布式锁 在分布式场景下为了保证数据最终一致性.在单进程的系统中,存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步(lock-synchronized), ...

  8. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

  9. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

最新文章

  1. JAVA中的list去重复
  2. Visual C++ 2011-6-6
  3. 安装class-dump
  4. 信息基础---LDPCcodes随机矩阵构造java项目源代码
  5. 反编译linux内核_Linux 后台开发常用调试工具
  6. linux中and运算符文件重定向,linux 重定向问题详解
  7. mysql isam cache_Mysql性能优化基础篇
  8. 动态规划算法-07背包问题进阶
  9. 1流明等于多少lux_要想投影仪画质清晰,投影仪流明和对比度不得不看
  10. JS 日期工具类-基于yDate
  11. Atitit.atijson 类库的新特性设计与实现 v3 q31
  12. 基于C#语言Windows窗体应用(.Net Framework)的教室点名系统V1.0
  13. 【运筹学】整数规划 ( 整数规划求解方法 | 指派问题 )
  14. 求职互联网技术岗应届生面试必备技巧分享
  15. 互联网新半场的流量生态——阿里云定向免流方案
  16. Centos修改DNS
  17. html中,table 的cellpadding cellspacing 属性失效
  18. antdv tabs闪动
  19. 微积分:如何理解方向导数与梯度?
  20. x=1u c语言,c语言中1u是什么意思

热门文章

  1. markdown插入图片的几个办法
  2. 手披云雾开鸿蒙,元朝关于泰山的古诗词
  3. 是德科技34901A支持的量程
  4. 网站关键词排名优化中常见的问题及解决方法
  5. Qtxlsx操作Excel之使用
  6. Win7系统不同程序无法同时播放声音是怎么回事?
  7. 此CA证书不受信任的解决办法
  8. 主宰操作系统的经典算法
  9. Excel如何批量调整行高
  10. 电脑tcp协议设置成服务器,电脑tcp协议设置成服务器