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


}
相关推荐
码界奇点1 分钟前
基于Spring Boot与MyBatis-Plus的后台管理系统设计与实现
spring boot·后端·车载系统·毕业设计·mybatis·源代码管理
sunnyday04261 分钟前
Spring Boot 应用启动成功后的事件监听与日志输出实践
java·spring boot·后端
短剑重铸之日6 分钟前
《7天学会Redis》Day 7 - Redisson 全览
java·数据库·redis·后端·缓存·redission
Qiuner7 分钟前
一文读懂 Lambda
java·spring boot·后端·架构
程序新视界12 分钟前
“提供溢出的情绪价值”是AI产品极具可能性的方向
人工智能·后端·产品
a程序小傲13 分钟前
中国邮政Java面试被问:Kafka的Log Compaction实现和删除策略
java·开发语言·后端·python·面试·职场和发展·kafka
岁岁种桃花儿14 分钟前
Spring Boot @GetMapping注解:从应用到原理深度解析
java·spring boot·后端
颜淡慕潇15 分钟前
Spring Boot 3.x 升级实战:3.0 → 3.5:为什么升、升什么、以及我们是怎么升的
java·spring boot·后端
BingoGo18 分钟前
Livewire4 正式发布!PHP 也可以无需写一行 Javascript 代码就能实现 Vue 的功能
后端·php
追逐时光者7 小时前
一个致力于为 C# 程序员提供更佳的编码体验和效率的 Visual Studio 扩展插件
后端·c#·visual studio