2. 配置参数:给Redisson布置"房间"
在application.yml
中配置Redis连接信息(单节点模式):
yaml
spring:
redis:
host: 127.0.0.1
port: 6379
password: your_password # 如果无密码则省略
database: 0
# Redisson专属配置(优先级高于spring.redis)
redisson:
config: |
singleServerConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
connectionPoolSize: 64
connectionMinimumIdleSize: 24
subscriptionConnectionPoolSize: 50
关键配置解析:
配置项 | 作用 | 默认值 |
---|---|---|
idleConnectionTimeout |
空闲连接超时时间(毫秒) | 10000 |
connectTimeout |
连接Redis服务器的超时时间 | 10000 |
timeout |
操作超时时间(如锁获取) | 3000 |
retryAttempts |
命令失败重试次数 | 3 |
connectionPoolSize |
最大连接池大小 | 64 |
connectionMinimumIdleSize |
最小空闲连接数(避免突发流量卡顿) | 24 |
3. 手动配置(可选):自定义"装修风格"
若需要更复杂的配置(如集群模式),可通过Java Config实现:
java
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient(@Value("${spring.redis.host}") String host,
@Value("${spring.redis.port}") String port) {
Config config = new Config();
// 单节点模式
config.useSingleServer()
.setAddress("redis://" + host + ":" + port)
.setConnectionPoolSize(64)
.setConnectionMinimumIdleSize(10);
// 集群模式示例
// config.useClusterServers().addNodeAddress("redis://node1:6379", "redis://node2:6380");
return Redisson.create(config);
}
}
二、配置详解:每个参数都是"生活小技巧"
1. 连接池优化
connectionPoolSize
:根据业务并发量调整,建议设置为QPS * 平均响应时间(秒)
。connectionMinimumIdleSize
:预热连接池,避免突发请求导致延迟。
2. 超时与重试
timeout
:锁获取超时时间,不宜过长(防止线程堆积)。retryAttempts
:网络抖动时自动重试,但高并发场景建议设为0(快速失败)。
3. 模式选择
模式 | 适用场景 | 配置示例 |
---|---|---|
单节点 | 开发环境或低并发生产环境 | useSingleServer() |
主从哨兵 | 高可用但非极端高并发 | useSentinelServers() |
集群模式 | 大数据量或超高并发场景 | useClusterServers() |
三、最佳实践:让Redisson成为你的"贤内助"
1. 配置管理:分环境隔离
- 开发环境:单节点,关闭密码,简化配置。
- 生产环境 :使用哨兵或集群,通过
spring.profiles.active
切换:
yaml
# application-prod.yml
spring:
redis:
redisson:
config: |
sentinelServersConfig:
sentinelAddresses:
- "redis://sentinel1:26379"
- "redis://sentinel2:26380"
masterName: "myMaster"
password: "prod_password"
2. 连接池调优:避免"堵车"
-
计算公式 :
最大连接数 ≈ 最大并发线程数 × 平均每个请求占用Redis时间(秒)
例如:500 QPS,每个请求耗时10ms → 500 * 0.01 = 5 → 设置
connectionPoolSize: 10
(预留缓冲)。
3. 异常处理:优雅应对"吵架"
- 捕获锁获取异常:
java
try {
if (lock.tryLock(1, TimeUnit.SECONDS)) {
// 业务代码
} else {
log.warn("获取锁失败,稍后重试");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
4. 监控与健康检查
- Spring Boot Actuator集成:
yaml
management:
endpoints:
web:
exposure:
include: health
health:
redis:
enabled: true
访问/actuator/health
可查看Redis连接状态。
四、避坑指南:别让锁成为"家庭矛盾"
-
配置未生效:
- 检查是否同时存在
spring.redis
和redisson.config
,后者优先级更高。
- 检查是否同时存在
-
连接泄露:
- 确保每次
getLock()
后都执行unlock()
,推荐用try-with-resources
(需实现AutoCloseable
)。
- 确保每次
-
NPE异常:
- 注入
RedissonClient
时添加@Autowired(required = false)
,避免测试环境未配置Redis时启动失败。
- 注入
五、终极实践:Redisson与Spring Boot的"幸福生活"
示例:分布式定时任务调度
java
@Scheduled(cron = "0/10 * * * * ?")
public void scheduledTask() {
RLock lock = redissonClient.getLock("scheduleLock");
try {
if (lock.tryLock(0, 30, TimeUnit.SECONDS)) {
// 保证同一时间只有一个实例执行任务
executeBusinessLogic();
}
} finally {
lock.unlock();
}
}
效果:多个服务实例部署时,定时任务自动互斥执行。
总结:从"同居"到"默契配合"
通过Spring Boot的自动化配置,Redisson能快速融入你的项目。记住:
- 配置要"量体裁衣":根据并发量和业务场景调整参数。
- 锁要"及时归还":避免占用资源引发"家庭矛盾"。
- 监控要"随时待命":用Actuator和日志守护你的分布式锁。
最后彩蛋 :如果Redisson和Spring Boot吵架了,记得检查@Autowired
有没有写错!😉