Spring Boot 中集成 Redisson 和 Redis

988 阅读3分钟

在 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. 连接管理与资源优化

  • 连接池配置:合理设置 connectionPoolSizeidleConnectionTimeout

  • 长连接复用:避免频繁创建/销毁连接,利用连接池复用。

  • 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
  • 分布式队列RQueueRBlockingQueue
  • 发布订阅RTopic 实现消息广播。
  • 分布式集合RSetRScoredSortedSet

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)减少样板代码。

通过遵循这些实践,可以显著提升系统的稳定性、性能和可维护性。