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


}
相关推荐
天南星18 分钟前
java-WebSocket在Java生态中的发展历程
java·后端·websocket
工藤学编程44 分钟前
分库分表之实战-sharding-JDBC绑定表配置实战
数据库·分布式·后端·sql·mysql
fmvrj342021 小时前
云原生:数字化转型的核心引擎
后端
码出极致1 小时前
Redisson分布式缓存与数据一致性保障
后端
用户790349033711 小时前
springboot集成redisson实现redis分布式锁
后端
陈随易1 小时前
程序员的新玩具,MoonBit(月兔)编程语言科普
前端·后端·程序员
码出极致2 小时前
Redisson秒杀系统中的分布式锁应用
后端
xiaok2 小时前
@Param注解的作用
java·后端
Sperains2 小时前
async/await和Synchronous的区别
后端
码出极致2 小时前
Redisson可重入锁(RLock)的使用与原理
后端