引言
在分布式系统架构中,数据一致性、高并发控制和资源协调是开发者面临的核心挑战。Redisson作为基于Redis的Java客户端,不仅提供了丰富的分布式对象和服务,还简化了分布式场景下的编程模型。本文将通过实际代码示例,解析Redisson在真实项目中的五大典型应用场景。
场景一:分布式锁实现秒杀库存控制
背景:电商秒杀活动中,防止超卖是关键。传统的本地锁无法跨JVM生效,需借助分布式锁。
Redisson方案:使用RLock
实现可重入锁,支持自动续期和超时释放。
// 获取锁对象
RLock lock = redissonClient.getLock("seckill:lock:" + productId);
try {
// 尝试加锁,最多等待100ms,锁自动释放时间30s
if (lock.tryLock(100, 30000, TimeUnit.MILLISECONDS)) {
// 执行库存扣减逻辑
int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));
if (stock > 0) {
redisTemplate.opsForValue().set("stock", String.valueOf(stock - 1));
}
}
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
优势:
-
自动续期避免业务未完成锁过期
-
支持看门狗机制防止死锁
-
相比原生Redis命令,API更简洁
场景二:多节点共享数据(分布式集合)
背景:跨服务的Session管理需要共享数据,且需保证原子性操作。
Redisson方案:使用RMap
实现分布式Map,支持本地缓存和淘汰策略。
RMap<String, UserSession> sessionMap = redissonClient.getMap("global:sessions");
// 添加会话(自动序列化)
sessionMap.put(sessionId, new UserSession(userId, System.currentTimeMillis()));
// 带过期时间的原子操作
sessionMap.expire(30, TimeUnit.MINUTES);
// 遍历所有活跃会话
sessionMap.readAllValues().forEach(session ->
System.out.println("活跃用户:" + session.getUserId()));
扩展应用:
-
全局配置中心
-
分布式统计计数器
-
实时排行榜(配合
RScoredSortedSet
)
场景三:API限流保护系统
背景:防止恶意请求压垮核心接口,需实现每秒最多100次调用。
Redisson方案:采用RRateLimiter
实现令牌桶限流。
RRateLimiter rateLimiter = redissonClient.getRateLimiter("api:limit:orderCreate");
// 初始化:每秒补充100个令牌,最大累积100个
rateLimiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.SECONDS);
if (rateLimiter.tryAcquire(1)) {
// 处理订单创建逻辑
} else {
throw new RuntimeException("请求过于频繁");
}
进阶配置:
-
按用户/IP维度限流
-
结合Spring AOP实现注解式限流
-
滑动时间窗口统计
场景四:分布式任务调度
背景:需要跨多个服务节点执行定时任务,且保证单实例运行。
Redisson方案:使用RScheduledExecutorService
替代Quartz。
RScheduledExecutorService executor = redissonClient.getExecutorService("taskExecutor");
// 注册每天凌晨执行的报表生成任务
executor.scheduleAtFixedTime(
() -> generateDailyReport(),
LocalTime.of(0, 5).toSecondOfDay(), // 00:05执行
TimeUnit.DAYS.toSeconds(1), // 间隔24小时
TimeUnit.SECONDS
);
// 查看任务状态
Set<ScheduledTask> tasks = executor.getScheduledTasks();
优势:
-
故障转移自动切换节点
-
任务状态持久化
-
支持Cron表达式
场景五:发布订阅实现实时通知
背景:订单状态变更后需实时通知多个子系统(物流、营销等)。
Redisson方案:通过RTopic
实现跨服务消息广播。
发布端:
RTopic topic = redissonClient.getTopic("order:statusChanged");
long clientsReceived = topic.publish(new OrderEvent(orderId, "PAID"));
订阅端:
RTopic topic = redissonClient.getTopic("order:statusChanged");
topic.addListener(OrderEvent.class, (channel, msg) -> {
log.info("收到订单{}状态更新:{}", msg.getOrderId(), msg.getStatus());
// 触发后续处理逻辑
});
特点:
-
支持集群模式下的跨节点通信
-
消息持久化可配置
-
相比传统MQ更轻量
配置Redisson客户端
Spring Boot集成示例:
# application.yml
spring:
redis:
host: redis-cluster.example.com
port: 6379
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useClusterServers()
.addNodeAddress("redis://redis-cluster.example.com:6379")
.setPassword("your_password")
.setTimeout(3000);
return Redisson.create(config);
}
}
注意事项
-
合理设置TTL避免内存泄漏
-
集群模式下避免大Key影响性能
-
使用连接池优化资源消耗
-
监控慢查询和内存使用
总结
Redisson通过丰富的分布式对象(锁、集合、队列等)和易用的API,显著降低了分布式系统的开发复杂度。本文演示的五大场景仅是Redisson能力的冰山一角,更多特性如布隆过滤器、分布式信号量等,等待开发者进一步探索。