• [springboot专栏]使用redisson实现分布式锁


    一、介绍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.redissongroupId>
         
         <artifactId>redisson-spring-data-22artifactId>
         <version>3.15.0version>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    <dependency>
      <groupId>org.redissongroupId>
      <artifactId>redisson-spring-boot-starterartifactId>
      <version>3.15.0version>
      <exclusions>
        <exclusion>
          <groupId>org.redissongroupId>
          
          <artifactId>redisson-spring-data-23artifactId>
        exclusion>
      exclusions>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    下面的这一步从我的实验来看,可做可不做,不影响。但是既然我们使用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
    
    • 1
    • 2
    • 3
    • 4

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

    哨兵模式、集群模式等更多配置参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95

    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: ! {}
    transportMode: "NIO"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

    四、分布式锁的实现

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

    @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();   //释放锁
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 相对于RedisLockRegistry另一个小优点是:我们可以为每一个锁指定锁定的超时时间。RedisLockRegistry目前只能针对所有的锁设定统一的超时时间
    • 如果业务执行超时之后,再去unlock会抛出java.lang.IllegalMonitorStateException

    上面的用法可以满足你绝大部分的分布式锁的业务场景,更多的用法参考官方wiki:
    https://github.com/redisson/redisson/wiki/8.-分布式锁和同步器

  • 相关阅读:
    2 Spring Boot 整合 Thymeleaf
    CDN网络基础入门:CDN原理及架构
    group by and union all
    【FPGA教程案例44】图像案例4——基于FPGA的图像中值滤波verilog实现,通过MATLAB进行辅助验证
    用opencv绘制一个箭头,沿着圆运动并留下运动轨迹(c++)
    知识蒸馏4:准备数据集并修改网络配置
    SSM框架整合
    npm包【详解】(内含npm包的开发、发布、安装、更新、搜索、卸载、查看、版本号更新规则、package.json详解等)
    Redis 内存淘汰策略
    电赛控制类PID算法实现
  • 原文地址:https://blog.csdn.net/hanxiaotongtong/article/details/122906745