在 Spring Boot 中集成 Redisson 和 Redis 时,遵循最佳实践可以确保高性能、高可用性和代码可维护性。以下是关键实践总结:
1. 配置与依赖管理
1.1 添加依赖
<!-- Redisson Starter -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.23.4</version>
</dependency>
1.2 配置文件
application.yml 中配置 Redis 连接:
spring:
redis:
host: localhost
port: 6379
# 集群/哨兵模式配置示例:
# cluster:
# nodes: redis1:6379,redis2:6379,redis3:6379
# sentinel:
# master: mymaster
# nodes: sentinel1:26379,sentinel2:26379
1.3 自定义 Redisson 配置
通过 RedissonAutoConfiguration 扩展配置:
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient(RedisProperties properties) {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://" + properties.getHost() + ":" + properties.getPort())
.setConnectionPoolSize(64) // 连接池优化
.setIdleConnectionTimeout(10000);
return Redisson.create(config);
}
}
2. 连接管理与资源优化
-
连接池配置:合理设置
connectionPoolSize和idleConnectionTimeout。 -
长连接复用:避免频繁创建/销毁连接,利用连接池复用。
-
SSL/TLS:生产环境启用加密连接:
config.useSingleServer().setSslEnableEndpointIdentification(true);
3. 分布式锁最佳实践
3.1 基础锁使用
RLock lock = redissonClient.getLock("resourceLock");
try {
if (lock.tryLock(5, 30, TimeUnit.SECONDS)) { // 等待5秒,锁30秒自动释放
// 业务逻辑
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
3.2 避免死锁
- 看门狗机制:Redisson 默认自动续期锁,无需手动处理。
- 明确超时时间:避免设置过长或过短的锁超时。
- 异常处理:确保
finally块中释放锁。
4. 缓存策略
4.1 本地缓存 + Redis 二级缓存
RMapCache<String, Object> cache = redissonClient.getMapCache("userCache");
cache.put("user:1", user, 10, TimeUnit.MINUTES); // TTL 10分钟
4.2 缓存穿透/雪崩防护
- 空值缓存:对查询为空的键设置短TTL。
- 随机过期时间:避免批量缓存同时失效。
- Bloom Filter:预先过滤无效请求。
5. 异步与高性能操作
5.1 异步API
RFuture<Void> future = redissonClient.getBucket("key").setAsync("value");
future.thenAccept(result -> System.out.println("操作完成"));
5.2 批量操作
使用 RBatch 提升批量操作性能:
RBatch batch = redissonClient.createBatch();
batch.getMap("data").fastPutAsync("k1", "v1");
batch.getMap("data").fastPutAsync("k2", "v2");
batch.execute();
6. 数据结构选择
- 高频计数:使用
RAtomicLong。 - 分布式队列:
RQueue或RBlockingQueue。 - 发布订阅:
RTopic实现消息广播。 - 分布式集合:
RSet、RScoredSortedSet。
7. 监控与运维
- 指标监控:集成 Prometheus + Grafana 监控 Redis 性能。
- 慢查询日志:定期检查
slowlog。 - 内存优化:使用
SCAN代替KEYS,合理设置 TTL。
8. 高可用与灾备
-
部署模式:
- 集群模式:数据分片,高并发场景。
- 哨兵模式:自动故障转移。
- 主从复制:读写分离。
-
备份策略:定期 RDB/AOF 持久化。
9. 异常处理
- 重试机制:对网络波动设计重试逻辑。
- 降级策略:Redis 不可用时切换本地缓存或数据库。
10. 代码规范
-
Key 命名规范:如
service:key(例:order:123)。 -
资源释放:确保
RedissonClient在应用关闭时销毁:@PreDestroy public void destroy() { redissonClient.shutdown(); } -
AOP 切面:通过注解统一管理缓存和锁逻辑。
示例:Spring Cache + Redisson 整合
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager(RedissonClient redissonClient) {
Map<String, CacheConfig> config = new HashMap<>();
config.put("userCache", new CacheConfig(60*60*1000, 30*60*1000)); // 1小时过期,30分钟最大空闲
return new RedissonSpringCacheManager(redissonClient, config);
}
}
// 使用注解
@Cacheable(value = "userCache", key = "#userId")
public User getUserById(String userId) {
// DB 查询
}
总结
- 配置优化:根据场景选择部署模式,调优连接参数。
- 资源管理:及时释放锁和连接,避免泄漏。
- 监控告警:实时监控 Redis 健康状态。
- 代码简洁:利用 Spring 抽象层(如
@Cacheable)减少样板代码。
通过遵循这些实践,可以显著提升系统的稳定性、性能和可维护性。