简介:本文全面解析RedissonClient的核心功能与使用方法,涵盖基础配置、分布式锁、集合操作、发布订阅等场景,提供生产环境优化建议及故障排查方案,助力开发者高效实现分布式系统。
RedissonClient 是基于 Redis 的 Java 客户端,专为分布式系统设计,提供比原生 Jedis 更丰富的功能集。其核心优势体现在三个方面:
在电商秒杀系统中,使用 RedissonClient 的分布式锁可确保同一用户只能生成一个订单,避免超卖问题。其 RLock 实现基于 Redis 的 SETNX 命令,支持可重入、公平锁、超时自动释放等特性,比数据库乐观锁更高效。
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://node1:6379", "redis://node2:6379").setScanInterval(2000) // 集群节点发现间隔(ms).setMasterConnectionPoolSize(50).setSlaveConnectionPoolSize(25);
masterConnectionPoolSize = 并发数 * 2timeout 默认 3000ms,网络延迟较高时可适当增加retryAttempts 默认 3 次,重要业务建议设置为 5 次
RLock lock = redisson.getLock("order_lock");try {// 尝试获取锁,最多等待100秒,上锁后10秒自动解锁boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {// 执行业务逻辑}} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}
RFuture<RLock> lockFuture1 = redisson1.getLock("resource").tryLockAsync();RFuture<RLock> lockFuture2 = redisson2.getLock("resource").tryLockAsync();RFuture<RLock> lockFuture3 = redisson3.getLock("resource").tryLockAsync();// 等待所有锁获取完成List<RLock> locked = new ArrayList<>();locked.add(lockFuture1.getNow());locked.add(lockFuture2.getNow());locked.add(lockFuture3.getNow());// 创建红锁RedissonRedLock redLock = new RedissonRedLock(locked.toArray(new RLock[0]));try {redLock.tryLock(10, 30, TimeUnit.SECONDS);// 执行业务逻辑} finally {redLock.unlock();}
RMap<String, User> userMap = redisson.getMap("users");// 原子性操作示例userMap.putIfAbsent("user1", new User("Alice"));User existing = userMap.merge("user1", new User("Bob"),(oldVal, newVal) -> new User(oldVal.getName() + "|" + newVal.getName()));// 扫描操作(避免全量加载)MapScanIterator<String, User> iterator = userMap.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, User> entry = iterator.next();// 处理数据}
RBlockingQueue<Order> orderQueue = redisson.getBlockingQueue("order_queue");RQueue<Order> processingQueue = redisson.getQueue("processing_queue");// 生产者orderQueue.offer(new Order("order1"));// 消费者while (true) {try {Order order = orderQueue.take(); // 阻塞式获取processingQueue.add(order);// 处理订单} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}
// 订阅端RTopic topic = redisson.getTopic("order_events");topic.addListener(String.class, (channel, msg) -> {System.out.println("Received: " + msg);});// 发布端topic.publish("New order created: ORD123");
// 订阅所有以"order."开头的频道PatternTopic patternTopic = new PatternTopic("order.*");redisson.getTopic(patternTopic).addListener(String.class, (channel, msg) -> {System.out.println("Pattern match on " + channel + ": " + msg);});
序列化优化:
config.setCodec(new JsonJacksonCodec());
异步操作使用:
RFuture<Boolean> future = redisson.getLock("lock").tryLockAsync();future.onComplete((res, exception) -> {if (exception != null) {// 处理异常} else if (res) {// 获取锁成功}});
批量操作:
RBatch batch = redisson.createBatch();batch.getMap("test").fastPutAsync("key1", "value1");batch.getMap("test").fastPutAsync("key2", "value2");batch.execute(); // 原子性执行
JMX 监控配置:
config.useSingleServer().setJmxEnable(true).setJmxDomain("org.redisson");
通过 JConsole 可监控:
慢查询日志:
config.useSingleServer().setSlowlogEnabled(true).setSlowlogThreshold(2000); // 记录执行超过2s的命令
常见问题解决方案:
timeout 配置HSCAN/SSCAN 替代全量查询maxmemory 策略,启用 Redis 集群
// 服务端实现RRemoteService service = redisson.getRemoteService();service.register(UserService.class, new UserServiceImpl(), 10); // 10个实例// 客户端调用UserService proxy = service.get(UserService.class);User user = proxy.getUserById("123");
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("urls");bloomFilter.tryInit(100000L, 0.03); // 预期元素数量,误判率bloomFilter.add("http://example.com");boolean contains = bloomFilter.contains("http://example.com");
RRateLimiter rateLimiter = redisson.getRateLimiter("order_limiter");rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);if (rateLimiter.tryAcquire()) {// 允许通过} else {// 限流}
认证与授权:
config.useSingleServer().setPassword("complex-password").setClientName("order-service");
数据加密:
config.useSingleServer().setSslEnableEndpointIdentification(false).setSslProvider(SslProvider.JDK);
容灾设计:
config.useMasterSlaveServers().setMasterAddress("redis://master:6379").addSlaveAddress("redis://slave1:6379", "redis://slave2:6379");
本手册系统阐述了 RedissonClient 的核心功能与生产实践,从基础配置到高级应用提供了完整解决方案。实际开发中,建议结合业务场景进行参数调优,并通过监控系统持续观察运行状态。对于关键业务系统,建议建立完善的降级预案,确保在 Redis 不可用时能够平滑切换到备用方案。