简介:本文全面解析RedissonClient的核心功能与使用技巧,涵盖配置初始化、分布式锁、缓存管理、集群模式等关键场景,提供可落地的代码示例与性能优化建议,助力开发者高效解决分布式系统中的并发控制与数据一致性问题。
RedissonClient 是基于 Redis 的 Java 客户端,通过封装 Redis 操作提供分布式锁、缓存、发布订阅等高级功能。其核心优势在于:
RMap、RList、RQueue 等分布式集合。典型应用场景包括电商库存扣减、订单超时取消、分布式任务调度等需要强一致性的业务。
Maven 项目中添加依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.4</version> <!-- 使用最新稳定版 --></dependency>
Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0).setPassword("yourpassword"); // 可选RedissonClient redisson = Redisson.create(config);
Config config = new Config();config.useClusterServers().addNodeAddress("redis://192.168.1.1:7000", "redis://192.168.1.2:7001").setMasterConnectionPoolSize(20).setSlaveConnectionPoolSize(10);
setConnectTimeout(3000) 和 setTimeout(3000) 平衡响应速度与稳定性
RLock lock = redisson.getLock("orderLock");try {// 尝试加锁,最多等待100秒,上锁后10秒自动解锁boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 执行业务逻辑processOrder();}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();}}
tryLock 的返回值实现指数退避重试finally 块中释放锁,推荐使用 try-with-resources 模式(需自定义 AutoCloseable 包装)
RMap<String, Order> orderCache = redisson.getMap("orderCache");// 写入缓存(带过期时间)orderCache.put("order123", new Order(), 30, TimeUnit.MINUTES);// 原子性更新orderCache.addAndGet("counter", 1);// 批量操作Map<String, Order> batch = new HashMap<>();batch.put("order456", new Order());orderCache.putAll(batch);
@RedisCacheable 注解实现二级缓存RMapCache 的 EntryListener 监听数据变化
orderCache.addListener(new EntryAdapter<String, Order>() {@Overridepublic void onUpdated(MapEntryEvent<String, Order> event) {log.info("Order updated: {}", event.getKey());}});
// 订阅端RTopic topic = redisson.getTopic("orderEvents");topic.addListener(String.class, (channel, msg) -> {System.out.println("Received: " + msg);});// 发布端topic.publish("Order created: 123");
// 订阅所有以"order."开头的频道topic.addListener(PatternTopic.of("order.*"), (channel, msg) -> {...});
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络延迟/Redis 负载高 | 增加超时时间,检查 Redis 监控指标 |
| 锁获取失败 | 时钟漂移/GC 停顿 | 使用 NTP 同步时间,优化 JVM 参数 |
| 内存溢出 | 大对象缓存 | 启用 evictionPolicy,设置合理 TTL |
通过 RedissonMetrics 接口获取关键指标:
RedissonMetrics metrics = redisson.getMetrics();System.out.println("Active connections: " + metrics.getActiveConnections());System.out.println("Used memory: " + metrics.getUsedMemory());
配置哨兵模式实现高可用:
config.useSentinelServers().setMasterName("mymaster").addSentinelAddress("redis://192.168.1.3:26379").setFailFast(false); // 允许部分节点不可用时继续工作
// 服务端public interface OrderService {String createOrder(OrderRequest request);}Redisson.create().getRemoteService().register(OrderService.class, new OrderServiceImpl());// 客户端OrderService service = redisson.getRemoteService().get(OrderService.class);String orderId = service.createOrder(new OrderRequest(...));
RExecutorService executor = redisson.getExecutorService("myExecutor");executor.submit(new Runnable() {@Overridepublic void run() {System.out.println("Executed on node: " + Redisson.getNodeAddress());}});
requirepass 和 TLS 加密通过合理配置 RedissonClient 的各项功能,开发者可以高效解决分布式系统中的核心挑战,同时保持代码的简洁性和可维护性。建议结合实际业务场景进行压力测试,持续优化参数配置。