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


}
相关推荐
s***P9822 分钟前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
IguoChan1 小时前
D2L(1) — 线性回归
后端
8***29311 小时前
Go基础之环境搭建
开发语言·后端·golang
梅花142 小时前
基于Django房屋租赁系统
后端·python·django·bootstrap·django项目·django网站
提笔了无痕2 小时前
go web开发表单知识及表单处理详解
前端·后端·golang·web
qq_12498707532 小时前
基于SpringBoot技术的企业请假审批管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·信息可视化·毕业设计
小哀22 小时前
🌸 入职写了一个月全栈next.js 感想
前端·后端·ai编程
ziwu2 小时前
【民族服饰识别系统】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积网络+resnet50算法
人工智能·后端·图像识别
程序员Easy哥2 小时前
ID生成器第一讲:原理和常见几种生成器
后端
q***73552 小时前
SpringBoot中使用TraceId进行日志追踪
spring boot·后端·状态模式