Redisson 常用方法介绍

Redisson 常用方法介绍

  1. 分布式锁(RLock)相关方法

分布式锁是 Redisson 最核心的功能之一,支持可重入、自动续期等特性,常用于解决分布式环境下的资源竞争问题。

核心方法

  • lock():阻塞式获取锁,默认持有时间 30 秒(由看门狗自动续期)。

  • tryLock(long waitTime, long leaseTime, TimeUnit unit):尝试获取锁,最多等待waitTime,获取成功后持有leaseTime时长。

  • unlock():释放锁,需在finally中调用,避免锁泄漏。

  • isHeldByCurrentThread():判断当前线程是否持有锁,用于安全释放。

代码示例

csharp 复制代码
// 获取锁对象(锁名称通常关联业务ID,如"stock:1001")


RLock lock = redisson.getLock("order:create:1001");


try {


  // 尝试获取锁:最多等待5秒,获取成功后持有10秒(10秒后自动释放)


  boolean isLocked = lock.tryLock(5, 10, TimeUnit.SECONDS);


  if (isLocked) {


      // 执行业务逻辑(如创建订单、扣减库存)


      System.out.println("获取锁成功,执行业务...");


  } else {


      System.out.println("获取锁失败,可能存在并发冲突");


  }


} catch (InterruptedException e) {


  Thread.currentThread().interrupt();


} finally {


  // 确保只有当前线程持有锁时才释放


  if (lock.isHeldByCurrentThread()) {


      lock.unlock();


  }


}
  1. 分布式集合(RMap、RSet)相关方法

Redisson 提供了与 Java 标准集合 API 类似的分布式集合,支持跨节点共享数据。

核心方法(以 RMap 为例)

  • put(K key, V value):添加键值对,覆盖已有键。

  • putIfAbsent(K key, V value):原子性添加,仅当键不存在时生效。

  • get(Object key):获取键对应的值。

  • remove(Object key):删除键值对。

代码示例

csharp 复制代码
// 获取分布式Map(用于存储商品库存)


RMap\<String, Integer> stockMap = redisson.getMap("product:stock");


// 添加库存(若键已存在则覆盖)


stockMap.put("apple", 1000);


// 原子性添加(仅当"banana"不存在时设置值)


stockMap.putIfAbsent("banana", 500);


// 获取库存


Integer appleStock = stockMap.get("apple");


System.out.println("苹果库存:" + appleStock);


// 扣减库存(实际场景需配合分布式锁使用)


stockMap.put("apple", appleStock - 10);
// 删除键
stockMap.remove("banana");
  1. 分布式同步工具(RSemaphore、RCountDownLatch)相关方法

Redisson 提供了分布式环境下的同步工具,用于协调多个线程或服务的执行流程。

3.1 信号量(RSemaphore)

用于控制并发访问资源的线程数量,类似 "限流" 功能。

  • acquire():获取许可,若无可用许可则阻塞。

  • release():释放许可,供其他线程使用。

  • trySetPermits(int permits):初始化许可数量。

代码示例

scss 复制代码
// 获取信号量(控制最多5个并发请求)


RSemaphore semaphore = redisson.getSemaphore("api:limit");


semaphore.trySetPermits(5); // 初始化5个许可


try {


  // 获取许可(若许可用尽,会阻塞等待)


  semaphore.acquire();


  // 执行受限操作(如调用第三方接口)


  System.out.println("执行接口调用...");


} catch (InterruptedException e) {


  Thread.currentThread().interrupt();


} finally {


  // 释放许可,供其他线程使用


  semaphore.release();


}

3.2 闭锁(RCountDownLatch)

用于等待多个线程完成任务后再执行后续操作,支持跨服务协调。

  • trySetCount(long count):设置初始计数。

  • countDown():计数减 1。

  • await():阻塞等待,直到计数为 0。

代码示例

scss 复制代码
// 获取闭锁(等待3个初始化任务完成)


RCountDownLatch latch = redisson.getCountDownLatch("system:init");


latch.trySetCount(3); // 初始计数为3


// 模拟3个初始化线程


for (int i = 0; i < 3; i++) {


  new Thread(() -> {


      try {


          // 执行初始化任务(如加载配置、缓存预热)


          System.out.println("执行初始化任务...");


          Thread.sleep(1000);


      } catch (InterruptedException e) {


          Thread.currentThread().interrupt();


      } finally {


          // 任务完成,计数减1


          latch.countDown();


      }


  }).start();


}


// 主线程等待所有初始化完成


try {


  latch.await(); // 阻塞直到计数为0


  System.out.println("所有初始化任务完成,系统启动!");


} catch (InterruptedException e) {


  Thread.currentThread().interrupt();


}
相关推荐
唐叔在学习10 分钟前
就算没有服务器,我照样能够同步数据
后端·python·程序员
用户68545375977691 小时前
同步成本换并行度:多线程、协程、分片、MapReduce 怎么选才不踩坑
后端
javaTodo1 小时前
Claude Code 记忆机制详解:从 CLAUDE.md 到 Auto Memory,六层体系全拆解
后端
LSTM971 小时前
使用 C# 和 Spire.PDF 从 HTML 模板生成 PDF 的实用指南
后端
JaguarJack2 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
BingoGo2 小时前
为什么 PHP 闭包要加 static?
后端
是糖糖啊2 小时前
OpenClaw 从零到一实战指南(飞书接入)
前端·人工智能·后端
百度Geek说2 小时前
基于Spark的配置化离线反作弊系统
后端
Java编程爱好者3 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
后端