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();


}
相关推荐
杨DaB2 小时前
【SpringMVC】拦截器,实现小型登录验证
java·开发语言·后端·servlet·mvc
努力的小雨8 小时前
还在为调试提示词头疼?一个案例教你轻松上手!
后端
魔都吴所谓8 小时前
【go】语言的匿名变量如何定义与使用
开发语言·后端·golang
陈佬昔没带相机9 小时前
围观前后端对接的 TypeScript 最佳实践,我们缺什么?
前端·后端·api
Livingbody10 小时前
大模型微调数据集加载和分析
后端
Livingbody11 小时前
第一次免费使用A800显卡80GB显存微调Ernie大模型
后端
Goboy11 小时前
Java 使用 FileOutputStream 写 Excel 文件不落盘?
后端·面试·架构
Goboy12 小时前
讲了八百遍,你还是没有理解CAS
后端·面试·架构
麦兜*12 小时前
大模型时代,Transformer 架构中的核心注意力机制算法详解与优化实践
jvm·后端·深度学习·算法·spring·spring cloud·transformer
树獭叔叔12 小时前
Python 多进程与多线程:深入理解与实践指南
后端·python