Spring Boot 整合 Redisson
Redisson 是一个功能十分强大的 Redis Java 客户端,它提供了丰富的功能和API,支持同步和异步操作,以及 RxJava 和响应式编程模型。Redisson 提供了50多个基于 Redis 的 Java 对象和服务,包括 分布式锁、原子计数器、分布式集合(Set、Map、List、Queue) 等高级功能。它还还支持本地缓存和 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,你可以参阅其 官方文档(中文)。