使用Redission实现分布式锁

分布式锁在分布式系统中非常重要,主要用于解决多个进程/服务并发访问共享资源时的数据一致性问题。在日常开发中常用于:

1. 防止重复操作(幂等性控制)

  • 场景:用户重复提交订单、重复支付、重复点击等。

  • 示例
    用户快速点击“提交订单”按钮时,用 订单ID + 用户ID 作为锁的Key,确保同一订单不会被重复处理。

2. 秒杀/抢购(库存扣减)

  • 场景:高并发下扣减库存,防止超卖。

3. 定时任务调度(避免多实例重复执行)

  • 场景:集群环境下,确保定时任务(如每天报表生成)只由一个节点执行。

4. 分布式系统并发控制

  • 场景:多个服务实例同时操作共享资源(如文件、配置、数据库行)。

  • 示例
    多个节点同时修改同一份配置文件时,通过分布式锁确保串行化修改。

5. 缓存击穿保护

  • 场景:高并发下缓存失效时,防止大量请求直接穿透到数据库。

6. 全局唯一流水号生成

  • 场景:分布式系统中生成唯一订单号、交易号等。

  • 示例
    通过锁保护Redis/LDB的自增序列,避免号段重复。

7. 分布式事务协调

  • 场景:在Saga、TCC等分布式事务模式中,作为协调资源竞争的手段。

Redission的使用

1.引入依赖:

<!--使用redisson作为所有分布式锁,分布式对象等功能框架-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version>
</dependency>

2.完成配置,与Redis服务器建立连接:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;/*** @author* @Desc:redisson配置* @create: 2024-06-08 17:54**/
@Configuration
public class MyRedissonConfig {@Bean(destroyMethod = "shutdown")public RedissonClient redisson()throws IOException{Config config=new Config();config.useSingleServer().setAddress("redis://192.168.56.10:6379");return Redisson.create(config);}
}

上面代码中@Bean(destroyMethod="shutdown"),destroyMethod="shutdown" 起到作用为:当Spring容器关闭时,会自动调用RedissonClient实例的shutdown()方法来优雅地关闭Redisson客户端连接,关闭与Redis服务器的连接,释放所有相关资源,避免资源泄漏。

3.使用,在需要使用Redission的地方,使用注解完成资源注入:

    @Autowiredprivate RedissonClient redissonClient;

具体使用示例:

    @Autowiredprivate RedissonClient redissonClient;public static final String UPLOAD_LOCK = "seckill:upload:lock";// 每隔5秒执行一次@Scheduled(cron = "*/5 * * * *  ?")public void uploadSeckillSkuLatest3Days() {log.info("上架最近三天的秒杀商品");// 加上分布式锁,避免多个定时任务同时执行RLock lock = redissonClient.getLock(UPLOAD_LOCK);// 最多等待10秒,上锁成功,则执行秒杀商品上架逻辑lock.lock(10, TimeUnit.SECONDS);try {seckillSkuService.uploadSeckillSkuLatest3Days();} finally {lock.unlock();}}

上面代码中有2处需特别注意:

1.上锁时间,等待时间,需结合业务代码执行时间进行设置,比业务代码执行时间多出1~2秒;

2. 在finally代码块中释放锁,无论执行成功与否或有异常产生,都要释放锁,防止出现死锁。

拓展

1.技术选型建议

  1. Redis(Redisson):性能高,适合大多数场景(推荐)。

  2. Zookeeper:强一致性,适合对可靠性要求极高的场景。

  3. 数据库乐观锁/悲观锁:简单但性能较差,适合低频竞争场景。


2.注意事项

  • 锁的粒度:尽量细粒度(例如按订单ID锁,而非全局锁)。

  • 超时时间:避免死锁,设置合理的超时(Redisson默认30秒)。

  • 可重入性:确保锁支持同一线程重入(Redisson的RLock支持)。

  • 容错性:考虑Redis集群故障时的降级方案(如本地锁+告警)。

分布式锁是分布式系统的核心基础组件,合理使用能有效解决并发冲突问题。

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

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

相关文章

VScode 画时序图(FPGA)

1、先安装插件&#xff1a; 2、然后就可以编写一个.js文件&#xff0c;如下&#xff1a; {signal: [{name: clk, wave: p.......|..},{name: rstn, wave: 01......|..},{name: din_vld, wave: 0.1.0...|..},{name: din, wave: "x.x...|..", data: ["D0", …

嵌入式学习笔记——I2C

IIC协议详解 一、IIC协议简介二、IIC总线结构图三、IIC通信流程详解1. 空闲状态 : 双高空闲2. 起始信号&#xff08;START&#xff09;: 时高数下开始3. 停止信号&#xff08;STOP&#xff09;: 时高数上结束4. 数据传输格式 : 时高数稳&#xff0c;时低数变5. 应答信号 四、写…

Apifox Helper 与 Swagger3 区别

核心定位差异 Apifox Helper 定位&#xff1a;基于 IDEA 的代码注释解析工具&#xff0c;与 Apifox 平台深度集成&#xff0c;实现文档自动生成接口管理测试协作的一体化流程。 特点&#xff1a; 通过解析 Javadoc、KDoc 等注释生成文档&#xff0c;代码零侵入&#xff08;无…

单片机实现多线程的方法汇总

在单片机上实现“多线程”的方法有几种&#xff0c;下面按照从简单到复杂、从轻量到系统性来列出常见的方案&#xff1a; &#x1f9f5; 一、伪多线程&#xff08;最轻量&#xff09; 方法&#xff1a;主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份&#xff08;浮动静态路由&#xff09;配置验证 缺省路由配置验证 总结 华为HCIA 基础实验&#xff0d;静态路由 & eNSP静态路由 基础…

[项目总结] 在线OJ刷题系统项目技术应用(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Qt音频输出:QAudioOutput详解与示例

1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类&#xff0c;它提供了将PCM&#xff08;脉冲编码调制&#xff09;原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分&#xff0c;QAudioOutput允许开发者在应用程序中实现音频播放功能&#xff0c;支持多种音…

【计算机网络】Linux配置SNAT/DNAT策略

什么是NAT&#xff1f; NAT 全称是 Network Address Translation&#xff08;网络地址转换&#xff09;&#xff0c;是一个用来在多个设备共享一个公网 IP上网的技术。 NAT 的核心作用&#xff1a;将一个网络中的私有 IP 地址&#xff0c;转换为公网 IP 地址&#xff0c;从而…

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略&#xff1f; &#x1f914;二、Redis 的淘汰策略详解 &#x1f447;三、如何选择合适的淘汰策略&#xff1f; &#x1f914;➡️✅四、如何切换 Redis 的淘汰策略&#xff1f; ⚙️&#x1f527;五、总结 &#x1f389; &#x1f31f;我的其他文章…

存储基石:深度解读Linux磁盘管理机制与文件系统实战

Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备&#xff08;如硬盘、SSD、USB 等&#xff…

本节课课堂总结

匿名子类&#xff1a; 说明 和 Java 一样&#xff0c;可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。 单例对象&#xff08;伴生对象&#xff09; Scala语言是完全面向对象的语言&#xff0c;所以并没有静态的操作&#xff08;即在Scala中没有静态的概念&a…

I²C、SPI、UART、CAN 通信协议详解

一、协议基本特性对比 特性ICSPIUARTCAN通信类型同步、半双工同步、全双工异步、全双工异步、多主多从信号线SDA&#xff08;数据&#xff09;、SCL&#xff08;时钟&#xff09;MOSI、MISO、SCK、SS&#xff08;片选&#xff09;TX&#xff08;发送&#xff09;、RX&#xff…

【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法

系列文章目录 【diffusers 极速入门&#xff08;一&#xff09;】pipeline 实际调用的是什么&#xff1f; call 方法!【diffusers 极速入门&#xff08;二&#xff09;】如何得到扩散去噪的中间结果&#xff1f;Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

第十三章:持久化存储_《凤凰架构:构建可靠的大型分布式系统》

第十三章 持久化存储 一、Kubernetes存储设计核心概念 &#xff08;1&#xff09;存储抽象模型 PersistentVolume (PV)&#xff1a;集群级别的存储资源抽象&#xff08;如NFS卷/云存储盘&#xff09;PersistentVolumeClaim (PVC)&#xff1a;用户对存储资源的声明请求&#…

以太网安全

前言&#xff1a; 端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中&#xff0c;就可以实现隔离组内端口之间的二层数据的隔离端口安全是一种在交换机接入层实施的安全机制&#xff0c;旨在通过控制端口的MAC地址学习行为&#xff0c;确保仅授权设备能…

跨域问题前端解决

由于浏览器的同源策略&#xff0c;前后端分离的项目&#xff0c;调试的时候总是会遇到跨域的问题&#xff0c;这里通过修改前端代码解决跨域问题。 首先先查看前端代码的根目录下&#xff0c;有没有vue.config.js文件, 若有&#xff0c;使用方法1&#xff0c;若没有此文件&…

Elasticsearch 报错index_closed_exception

index_closed_exception 是 Elasticsearch 中的一个异常类型&#xff0c;它通常发生在尝试对一个已经被关闭&#xff08;closed&#xff09;的索引执行搜索、写入或其他操作时。在 Elasticsearch 中&#xff0c;索引是用来存储和检索数据的逻辑命名空间&#xff0c;可以将其类比…

LearnOpenGL-笔记-其九

今天让我们完结高级OpenGL的部分&#xff1a; Instancing 很多时候&#xff0c;在场景中包含有大量实例的时候&#xff0c;光是调用GPU的绘制函数这个过程都会带来非常大的开销&#xff0c;因此我们需要想办法在每一次调用GPU的绘制函数时尽可能多地绘制&#xff0c;这个过程就…

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器&#xff0c;它允许你在网页上嵌入PDF文件&#xff0c;并提供基本的阅读功能。要实现搜索并高亮显示文本&#xff0c;你可以通过以下几个步骤来完成&#xff1a; 1. 引入PDF…

二叉树——队列bfs专题

1.N叉树的层序遍历 我们之前遇到过二叉树的层序遍历&#xff0c;只需要用队列先进先出的特性就可以达到层序遍历的目的。 而这里不是二叉树&#xff0c;也就是说让节点的孩子入队列时不仅仅是左右孩子了&#xff0c;而是它的所有孩子。而我们看这棵多叉树的构造&#xff0c;它…