Redisson分布式锁全攻略:用法、场景与要点

news2025/4/19 5:55:41

目录

1. 普通可重入锁(RLock)

2. 公平锁(RFairLock)

3. 读写锁(RReadWriteLock)

4. 多重锁(RedissonMultiLock)


1. 普通可重入锁(RLock)

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonLockExample {
    public static void main(String[] args) {
        // 配置 Redisson 客户端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        // 创建 Redisson 客户端实例
        RedissonClient redisson = Redisson.create(config);

        // 获取锁实例
        RLock lock = redisson.getLock("myLock");

        try {
            // 尝试获取锁,最多等待 100 秒,锁持有时间为 10 秒
            boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);
            if (isLocked) {
                // 执行业务逻辑
                System.out.println("Lock acquired by " + Thread.currentThread().getName());
                // 模拟业务逻辑处理
                Thread.sleep(5000);
            } else {
                System.out.println("Failed to acquire lock");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println("Lock released by " + Thread.currentThread().getName());
            }
        }

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}
应用场景
  • 电商秒杀系统:多个用户同时请求购买商品,通过分布式锁确保同一时间只有一个用户能够成功下单。

  • 分布式任务调度:多个节点同时运行任务,通过锁确保任务的唯一性。

注释说明
  • tryLock 方法:尝试获取锁,可以指定等待时间和锁的持有时间。

  • isHeldByCurrentThread 方法:检查当前线程是否持有锁,避免误释放。

  • unlock 方法:释放锁,确保在 finally 块中调用,防止资源泄漏。


2. 公平锁(RFairLock)

示例代码
import org.redisson.Redisson;
import org.redisson.api.RFairLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonFairLockExample {
    public static void main(String[] args) {
        // 配置 Redisson 客户端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        // 创建 Redisson 客户端实例
        RedissonClient redisson = Redisson.create(config);

        // 获取公平锁实例
        RFairLock lock = redisson.getFairLock("myFairLock");

        try {
            // 尝试获取锁,最多等待 100 秒,锁持有时间为 10 秒
            boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);
            if (isLocked) {
                // 执行业务逻辑
                System.out.println("Fair lock acquired by " + Thread.currentThread().getName());
                // 模拟业务逻辑处理
                Thread.sleep(5000);
            } else {
                System.out.println("Failed to acquire fair lock");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println("Fair lock released by " + Thread.currentThread().getName());
            }
        }

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}
应用场景
  • 资源分配系统:多个线程或节点请求资源,通过公平锁确保按请求顺序获取资源。

  • 队列处理系统:多个消费者处理队列中的任务,确保任务按顺序处理。

注释说明
  • 公平锁特点:按照请求顺序获取锁,避免饥饿现象。

  • tryLock 方法:与普通锁类似,但公平锁会按照请求顺序排队。


3. 读写锁(RReadWriteLock)

示例代码
import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonReadWriteLockExample {
    public static void main(String[] args) {
        // 配置 Redisson 客户端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        // 创建 Redisson 客户端实例
        RedissonClient redisson = Redisson.create(config);

        // 获取读写锁实例
        RReadWriteLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock");

        // 模拟读操作
        Thread readThread = new Thread(() -> {
            try {
                readWriteLock.readLock().lock();
                System.out.println("Read lock acquired by " + Thread.currentThread().getName());
                // 模拟读操作
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                readWriteLock.readLock().unlock();
                System.out.println("Read lock released by " + Thread.currentThread().getName());
            }
        });

        // 模拟写操作
        Thread writeThread = new Thread(() -> {
            try {
                readWriteLock.writeLock().lock();
                System.out.println("Write lock acquired by " + Thread.currentThread().getName());
                // 模拟写操作
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                readWriteLock.writeLock().unlock();
                System.out.println("Write lock released by " + Thread.currentThread().getName());
            }
        });

        // 启动线程
        readThread.start();
        writeThread.start();

        try {
            readThread.join();
            writeThread.join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}
应用场景
  • 缓存系统:多个线程读取缓存,少数线程更新缓存,通过读写锁提高并发性能。

  • 数据库查询与更新:多个线程查询数据库,少数线程更新数据库。

注释说明
  • 读锁共享:多个线程可以同时获取读锁。

  • 写锁独占:写锁获取后,其他线程无法获取读锁或写锁。

  • 锁的释放:确保在 finally 块中释放锁,避免死锁。


4. 多重锁(RedissonMultiLock)

示例代码
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.api.RedissonMultiLock;
import org.redisson.config.Config;

public class RedissonMultiLockExample {
    public static void main(String[] args) {
        // 配置 Redisson 客户端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        // 创建 Redisson 客户端实例
        RedissonClient redisson = Redisson.create(config);

        // 获取多个锁实例
        RLock lock1 = redisson.getLock("myLock1");
        RLock lock2 = redisson.getLock("myLock2");

        // 创建多重锁
        RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);

        try {
            // 尝试获取多重锁,最多等待 100 秒,锁持有时间为 10 秒
            boolean isLocked = multiLock.tryLock(100, 10, TimeUnit.SECONDS);
            if (isLocked) {
                // 执行业务逻辑
                System.out.println("Multi lock acquired by " + Thread.currentThread().getName());
                // 模拟业务逻辑处理
                Thread.sleep(5000);
            } else {
                System.out.println("Failed to acquire multi lock");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 释放多重锁
            if (multiLock.isHeldByCurrentThread()) {
                multiLock.unlock();
                System.out.println("Multi lock released by " + Thread.currentThread().getName());
            }
        }

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}
应用场景
  • 分布式事务:多个资源需要同时锁定,确保事务的原子性。

  • 复杂业务流程:多个步骤需要分别锁定不同资源,通过多重锁确保整体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试——BUG概念

目录 一、软件测试生命周期 二、BUG 2.1BUG概念 2.2BUG要素 2.3BUG级别 2.4 BUG的生命周期 2.5测试人员与开发人员因为BUG发生争执 2.6BUG评审 一、软件测试生命周期 软件测试贯穿于软件的整个生命周期 软件测试的生命周期指测试流程,每个阶段有不同的目标…

二、Android Studio环境安装

一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…

Hyperlane:重新定义Rust Web开发的未来 [特殊字符][特殊字符]

Hyperlane:重新定义Rust Web开发的未来 🚀🔥 大家好!👋 今天我要向各位技术爱好者介绍一个令人兴奋的Rust HTTP服务器库——Hyperlane 🌟。作为一个轻量级、高性能的框架,Hyperlane正在悄然改变…

从零构建机器学习流水线:Dagster+PyTorch实战指南

本文将系统讲解机器学习流水线的核心原理,并通过Dagster编排框架与PyTorch深度学习库的实战结合,手把手演示从数据预处理到生产部署的全流程。文中包含可运行的代码示例、最佳实践和性能对比分析,帮助开发者快速构建可扩展、易维护的机器学习…

React 项目src文件结构

SCSS 组件库 SCSS为预处理器 支持除原生CSS外的其他语句 别名路径 在项目下的第一级目录就加入craco.config.js文件并且修改packpage.js 中的部分 // 扩展webpage的配置const path require(path)module.exports {// exports配置webpack:{// 配置别名alias:{:path.resolve(__d…

Redis --- 基本数据类型

Redis --- 基本数据类型 Redis Intro5种基础数据类型 Redis Intro Redis(Remote Dictionary Server)是一款开源的高性能键值存储系统,常用于缓存、消息中间件和实时数据处理场景。以下是其核心特点、数据类型及典型使用场景: 核心…

React 高级特性与最佳实践

在掌握了 React 的基础知识后,我们可以进一步探索 React 的高级特性和最佳实践。这些特性将帮助你构建更高效、可维护和可扩展的 React 应用。本文重点介绍 Hooks、Context、Refs 和高阶组件等核心高级特性。 1. Hooks:函数组件的强大工具 Hooks 是 Rea…

一个由通义千问以及FFmpeg的AVFrame、buffer引起的bug:前面几帧影响后面帧数据

目录 1 问题描述 2 我最开始的代码----错误代码 3 正确的代码 4 为什么前面帧的结果会叠加到了后面帧上----因为ffmpeg新一帧只更新上一帧变化的部分 5 以后不要用通义千问写代码 1 问题描述 某个项目中,需要做人脸马赛克,然后这个是君正的某款芯片…

12.第二阶段x64游戏实战-远程调试

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:11.第二阶段x64游戏实战-框架代码细节优化 本次写的内容是关于调试、排错相关的…

Coze 和 n8n 的详细介绍及多维度对比分析,涵盖功能、架构、适用场景、成本等关键指标

以下是 Coze 和 n8n 的详细介绍及多维度对比分析,涵盖功能、架构、适用场景、成本等关键指标: 一、Coze 详细介绍 1. 基础信息 类型:低代码自动化平台(SaaS)。开源性:闭源(企业版需付费&…

咋用fliki的AI生成各类视频?AI生成视频教程

最近想制作视频,多方考查了决定用fliki,于是订阅了一年试试,这个AI生成的视频效果来看真是不错,感兴趣的自己官网注册个账号体验一下就知道了。 fliki官网 Fliki生成视频教程 创建账户并登录 首先,访问fliki官网并注…

Linux : 进程等待以及进程终止

进程控制之进程等待 (一)fork函数1*fork函数返回值2.父子进程的写时拷贝 (二)进程终止1.进程退出码2.进程常见退出方法(1)_exit(2)exit(3)return 3.进程的异常…

LSTM结合LightGBM高纬时序预测

1. LSTM 时间序列预测 LSTM 是 RNN(Recurrent Neural Network)的一种变体,它解决了普通 RNN 训练时的梯度消失和梯度爆炸问题,适用于长期依赖的时间序列建模。 LSTM 结构 LSTM 由 输入门(Input Gate)、遗…

【统信UOS操作系统】python3.11安装numpy库及导入问题解决

一、安装Python3.11.4 首先来安装Python3.11.4。所用操作系统:统信UOS 前提是准备好Python3.11.4的安装包(可从官网下载(链接)),并解压到本地: 右键,选择“在终端中打开”&#xff…

【中间件】nginx反向代理实操

一、说明 nginx用于做反向代理,其目标是将浏览器中的请求进行转发,应用场景如下: 说明: 1、用户在浏览器中发送请求 2、nginx监听到浏览器中的请求时,将该请求转发到网关 3、网关再将请求转发至对应服务 二、具体操作…

鸿蒙应用(医院诊疗系统)开发篇2·Axios网络请求封装全流程解析

一、项目初始化与环境准备 1. 创建鸿蒙工程 src/main/ets/ ├── api/ │ ├── api.ets # 接口聚合入口 │ ├── login.ets # 登录模块接口 │ └── request.ets # 网络请求核心封装 └── pages/ └── login.ets # 登录页面逻辑…

突发重磅消息!!!CVE项目将被取消?

突发重磅消息!!!CVE项目将被取消?突发!来自可靠消息来源。MITRE 对 CVE 项目的支持将于明天到期。附件信件已发送给 CVE 董事会成员。https://mp.weixin.qq.com/s/N3qkiHaDfzDuBMK3JbBCjw

详解与FTP服务器相关操作

目录 什么是FTP服务器 搭建FTP服务器相关 ​编辑 Unity中与FTP相关的类 上传文件到FTP服务器 使用FTP服务器上传文件的关键点 开始上传 从FTP服务器下载文件到客户端 使用FTP下载文件的关键点 开始下载 关于FTP服务器的其他操作 将文件的上传,下载&…

解决 .Net 6.0 项目发布到IIS报错:HTTP Error 500.30

今天在将自己开发许久的项目上线的时候,发现 IIS 发布后请求后端老是报一个 HTTP Error 500.30 的异常,如下图所示。   后来仔细调查了一下发现是自己的程序中写了 UseStaticFiles 的依赖注入,这个的主要作用就是发布后端后,想…

STM32F103_HAL库+寄存器学习笔记16 - 监控CAN发送失败(轮询方式)

导言 《STM32F103_HAL库寄存器学习笔记15 - 梳理CAN发送失败时,涉及哪些寄存器》从上一章节看到,当CAN消息发送失败时,CAN错误状态寄存器ESR的TEC会持续累加,LEC等于0x03(ACK错误)。本次实验的目的是编写一…