Spring Boot 整合 Redisson

Redisson 是一个功能十分强大的 Redis Java 客户端,它提供了丰富的功能和API,支持同步和异步操作,以及 RxJava 和响应式编程模型。Redisson 提供了50多个基于 Redis 的 Java 对象和服务,包括 分布式锁原子计数器分布式集合SetMapListQueue) 等高级功能。它还还支持本地缓存和 RPC 调用等功能,是开发分布式应用和使用 Redis 的理想选择。

总之,Redisson 所提供的功能已经远远超出了一个 Redis 客户端的范畴,Redis 官方也 推荐使用它 作为 Java 的 Redis 客户端。

之前我们介绍过 如何在 Spring Boot 中整合、使用 Redis。我们用到了 Spring Data Redis 组件,这是由 Spring 提供的抽象,可以使用 Jedis、Lettuce 等客户端作为实现。

Redisson 官方提供了一个 redisson-spring-boot-starter 组件,它正是 Spring Data Redis 抽象的实现,也就是说,我们可以直接使用 redisson-spring-boot-starter 无缝替换 spring-boot-starter-data-redis

本文将会带你了解如何在 Spring Boot 中通过 redisson-spring-boot-starter 整合、使用 Redisson。

整合 Redisson

添加依赖

添加 redisson-spring-boot-starter 依赖即可。

<!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.23.5</version>
</dependency>

注意,不需要添加 spring-boot-starter-data-redis 依赖

redisson-spring-boot-starter 依赖于 redisson-spring-data 模块,与最新版本的 Spring Boot 兼容。如果需要支持之前的 Spring Boot 版本,可以降级 redisson-spring-data 模块。兼容版本如下:

redisson-spring-data Spring Boot
redisson-spring-data-16 1.3.y
redisson-spring-data-17 1.4.y
redisson-spring-data-18 1.5.y
redisson-spring-data-2x 2.x.y
redisson-spring-data-3x 3.x.y

配置属性

基本的配置属性如下:

spring:
  data:
    redis:
      # 数据库
      database: 0
      # 主机
      host: localhost
      # 端口
      port: 6379
      # 密码
      # password:
      # 读超时
      timeout: 5s
      # 连接超时
      connect-timeout: 5s

如果你使用的是 Spring Boot 2.x,那么需要使用 spring.redis 命名空间,而不是 spring.data.redis

你也可以在外部的 redisson.yaml 中配置 Redisson 属性,这种方式支持 单机模式主从模式集群模式哨兵模式代理模式多集群模式

然后在 application.yaml 中导入 redisson.yaml,如下:

spring:
  redis:
   redisson: 
      file: classpath:redisson.yaml

关于配置的更多细节,你可以参阅 官方文档

使用 RedissonClient

一切就绪后,除了常用的 StringRedisTemplate 外,我们还可以注入如下由 Redisson 提供的 Bean:

  • RedissonClient
  • RedissonRxClient(响应式)
  • RedissonReactiveClient(响应式)
  • RedisTemplate
  • ReactiveRedisTemplate(响应式)

测试

接下来,我们使用 RedissonClient 来实现一个分布式锁,以进行测试:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Lock;

import org.junit.jupiter.api.Test;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests {

    static final Logger logger = LoggerFactory.getLogger(DemoApplicationTests.class);

    // 注入 RedissonClient
    @Autowired
    RedissonClient redissonClient;

    // 计数器
    private int count;

    @Test
    public void test() throws InterruptedException {

        CountDownLatch countDownLatch = new CountDownLatch(1000);

        for (int i = 0; i < 1000; i++) {

            new Thread(() -> {

                // 每个线程都创建自己的锁对象
                // 这是基于 Redis 实现的分布式锁
                Lock lock = this.redissonClient.getLock("counterLock");

                try {
                    // 上锁
                    lock.lock();

                    // 计数器自增 1
                    this.count = this.count + 1;

                } finally {
                    // 释放锁
                    lock.unlock();
                }
                countDownLatch.countDown();
            }).start();
        }

        countDownLatch.await();

        logger.info("count = {}", this.count);
    }
}

如上。我们在测试类中注入了 RedissonClient Bean,并且定义了一个 count 属性。在测试方法中,启动 1000 个线程对 count 属性进行 +1 操作。其中,每个线程都通过 RedissonClient 获取分布式锁来控制对变量的并发修改。

运行测试,输出的日志如下:

INFO 4840 --- [           main] c.s.demo.test.DemoApplicationTests       : count = 1000

如你所见,最后的结果是 1000,分布式锁生效。

总结

本文介绍了如何在 Spring Boot 中快速整合 Redisson,以及如何通过 RedissonClient 实现一个分布式锁。关于 Redisson 的更多功能和API,你可以参阅其 官方文档(中文)