【Redis】Redis 分布式锁

news2024/11/23 23:15:32

文章目录

      • 概述
      • Redis 实现分布式锁
        • 加锁
        • 释放锁
        • 死锁

概述

在单体项目中,我们处理多线程同时操作某一处代码块或者变量时就使用 Synchronized 或者 Lock 锁去保证数据的安全性,但是,现在我们基本上都是使用微服务,当我们把服务部署到多个进程中去,这时候使用 Synchronized 或者 Lock 锁就没办法保证数据的安全性,这时候就需要用到分布式锁。

想要实现分布式锁,需要借助一个外部系统,所有进程都去这个系统上申请加锁,而这个外部系统,必须要实现互斥的能力,即两个请求同时进来,只会给一个进程返回成功,另一个返回失败(或等待)。

在这里插入图片描述


Redis 实现分布式锁

使用 SETNX 命令,这个命令表示SET if Not eXists,即如果 key 不存在,才会设置它的值,否则什么也不做,两个客户端进程可以执行这个命令,达到互斥,就可以实现一个分布式锁。

加锁

客户端 1 申请加锁,加锁成功:

127.0.0.1:6379> SETNX lock 1
(integer) 1     // 客户端1,加锁成功

客户端 2 申请加锁,因为它后到达,加锁失败:

127.0.0.1:6379> SETNX lock 1
(integer) 0     // 客户端2,加锁失败

释放锁

此时,加锁成功的客户端,就可以去操作共享资源,例如,修改 MySQL 的某一行数据,或者调用一个 API 请求。
操作完成后,还要及时释放锁,给后来者让出操作共享资源的机会,使用 DEL 命令删除这个 key 即可释放分布式锁:

127.0.0.1:6379> DEL lock // 释放锁
(integer) 1

这个逻辑非常简单,整体的路程就是这样:
在这里插入图片描述

死锁

但是,它存在一个很大的问题,当客户端 1 拿到锁后,如果发生下面的场景,就会造成死锁
1、程序处理业务逻辑异常,没及时释放锁;
2、进程挂了,没机会释放锁;
这时,这个客户端就会一直占用这个锁,而其它客户端就拿不到这把锁了。

我们很容易想到的方案是,在申请锁时,给这把锁设置一个到期时间,过了这个到期时间,就把锁释放掉。
在 Redis 中实现时,就是给这个 key 设置一个过期时间。这里我们假设,操作共享资源的时间不会超过 10s,那么在加锁时,给这个 key 设置 10s 过期即可,在 Redis 2.6.12 之后,Redis 扩展了 SET 命令的参数,用一条命令就可以实现加锁的时候同时给锁加上时间,来避免死锁的发生,命令如下
EX 后面跟的是秒,如果想要设置毫秒的话就用 PX

# 设置秒级的分布式锁
127.0.0.1:6379> SET lock 1 EX 10 NX
OK




End


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

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

相关文章

一文说透小程序插件及其作用价值

最近工作接触小程序插件比较多,就想着不如跟大家系统分享一下小程序插件相关的内容。 首先,我们要先弄清楚小程序插件究竟是什么? 简单来说,小程序插件就是可被添加到小程序内直接使用的功能组件。插件依附于主程序的辅助程序&a…

详解c++---string的介绍(上)

这里写目录标题什么是stringstring的构造函数string的赋值重载string的遍历第一种方式 [ ]第二种方式 范围for第三种方式 正向迭代器反向迭代器string中的capacitysize lengthmax_sizecapacityreserveresizeshrink_to_fitstring的element access什么是string 那这里大家就只用…

k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

文章目录1、openresty介绍和安装2、实现code-server的反向代理3、动态反向代理实现启动多个code-server访问k8s编程operator系列:k8s编程operator——(1) client-go基础部分k8s编程operator——(2) client-go中的informerk8s编程operator——(3) 自定义资源CRDk8s编…

【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略

回顾 前期 趁着下班前五分钟书写——Vue3通讯(常规写法、语法糖、v-modle、兄弟通讯)_0.活在风浪里的博客-CSDN博客Vue3 组件通讯https://blog.csdn.net/m0_57904695/article/details/128145150?spm1001.2014.3001.5501 目录 一、可选链接运算符【?.】 二、空…

AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库

(1)因为AD20需要自己画原理图库和PCB库。所以我建议新手先用立创EDA画好原理图,转换为PCB(注意,只需要转换出PCB即可,因为我们需要立创EDA的PCB库。不懂没关系,后面就清楚了) &#…

把随身WiFi的esim卡移植到SIM卡放到手机使用

esim移植到实体sim卡,手把手教你esim改实体卡操作 自用先机的棒子,3-5倍虚标,在单位用,网速还行就是信号不好,uz801_v3.0的板子,410单天线,没有改装潜力,发热还大,加了风…

炸裂!速度百倍提升,高性能 Python 编译器 Codon 火了!

众所周知,Python 是一门简单易学、具有强大功能的编程语言,在各种用户使用统计榜单中总是名列前茅。相应地,围绕 Python,研究者开发了各种便捷工具,以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官…

[附源码]Nodejs计算机毕业设计基于Web企业客户管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

数据分析图表-FineReport 图表切换接口

1. 概述 1.1 问题描述 图表往往是按照从左往右或从右往左的顺序来切换。那么如何实现点击图表直接切换到其他不相邻的图表呢?效果如下图所示: 1.2 实现思路 给图表添加 JavaScript 类型的超级链接,调用图表接口FR.Chart.WebUtils.getChart(…

如何选择美股l2接口类型?

如何选择美股l2接口类型? 首先要选择稳定的美股l2接口,因为在进行股票行情分析的时候对于其数据的真实性和准确性都有很高的要求。不靠谱的数据平台容易造成数据传输卡顿,或数据获取不准确的情况,轻则影响企业运作,重…

SpringSecurity[6]-Thymeleaf中Spring Security的使用/退出登录/Spring Security中CSRF

上一篇:SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现 链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客 十一、基于表达式的访问控制 十四、Thymeleaf中Spring Security的使用 Spring…

java计算机毕业设计基于安卓Android的校园财务流水系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

Unity脚本基础

【重点面试题】1、Unity3D中的协程(coroutine),C#线程和进程之间的区别是什么? 简记:协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Un…

workerman+TP6实战网站客服系统之项目初始化

TP6 官方手册: 安装 ThinkPHP6.0完全开发手册 看云 安装TP6: composer create-project topthink/think tp6 报错: 解决问题: PHP默认把这个 proc_open 函数禁用了,取消禁用即可 取消禁用函数流程参考之前一篇文章 php workerman入门之运行起来_山山河川的博客-CSDN博…

Java中的匿名内部类

一、什么是匿名内部类? 定义:巴拉巴拉巴拉,就不写了。 语法: 部分内容来源于:什么是匿名内部类,如何使用匿名内部类_Weihaom_的博客-CSDN博客_匿名内部类 二、为什么要有匿名内部类? 在开发…

【大数据入门核心技术-Flume】(二)Flume安装部署

目录 一、准备工作 1、基本Hadoop环境安装 2、下载安装包 二、安装 1、解压 2、修改环境变量 3、修改并配置 flume-env.sh 文件 4、验证是否安装成功 一、准备工作 1、基本Hadoop环境安装 参考 Hadoop安装 【大数据入门核心技术-Hadoop】(五&#xff09…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案,基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

[附源码]Node.js计算机毕业设计高铁乘坐舒适性在线调查及评价系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

挑灯夜战800个小时,终从外包成功上岸字节!入职那一天我眼眶湿润了

P8Java导图笔记 主目录: Java基础篇: JAVA基础对应详细解析文档 Java多线程并发篇: Java多线程并发知识点对应详解解析文档 JVM篇: JVM脑图对应详细文档解析 Spring原理 Spring原理对应详细解析文档 数据库 数据库对应详细解析文档…

[附源码]计算机毕业设计的连锁药店销售管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…