Redis机制-Redis互斥锁、分布式锁

目录

一 互斥锁

二 分布式锁

Redis实现分布式锁

redisson实现分布式锁

可重入性:

主从一致性(性能差):


一 互斥锁

假设我们现在有一个业务要实现秒杀优惠券的功能,如果是一个正常的流程,线程之间应该是这样运作的。

线程1先查询优惠券,如果库存充足,那么扣减库存,然后线程2来查询优惠券信息,如果充足,那么就扣减库存,但是这只是理想的情况。

那么如果出现图2的这种情况呢?

线程1在查询优惠券信息的时候发现库存是充足的,线程2查询的时候也是充足的,他俩都可以进行减库存的操作,假如优惠券只剩1张了,那么谁得到这个优惠券呢?这就是业务中可能出现的问题。

此时就需要用互斥锁来解决问题了

如图,假如线程1在获取互斥锁以后,线程2来了之后就只能发起获取锁的请求,只有当线程1操作完了之后释放锁,线程2获取到锁,才可以进行接下来的操作,这样就不会出现库存超卖的情况。

但是还有一个问题,上面所说的这种情况是针对单个Redis服务器进行加锁的,但是实际的业务逻辑中可能会有多个用户,访问多个Redis服务器,那么这时候要怎么解决呢?

二 分布式锁

假设我的代码部署到了多个tomcat中,每一个tomcat操控一个JVM,此时8080的虚拟机知道8081的线程1也在同时访问优惠券信息吗?这显然是不知道的。

此时就需要用到一个独立于tomcat之外的分布式锁来进行判断

如图,当8080的线程1进行访问时,其余的端口和线程都不可以进行访问,此时就达到了分布式锁的效果,有效的解决了超卖问题。要注意,分布式锁是加在Redis上的,不是自己的代码中。

Redis实现分布式锁

Redis实现分布式锁主要是利用Redis的setnx命令

SET LOCK VALUE NX EX 10  //加锁
DEL key                  //释放锁

第一条代码是加锁并且给锁设置过期时间,第二行代码是删除锁。如果不给锁设置过期时间,那么就有可能产生死锁的现象。即线程1执行时间过长,线程2一直在等待锁释放。

redisson实现分布式锁

redisson中也有分布式锁的实现

RLock lock = redissonClient.getLock("lock");
try{boolean isLock = lock.tryLock(10,TimeUnit.SECONDS);if(isLock){System.out.println("执行业务");}
} finally{lock.unlock();}

首先,线程1获取到锁之后,然后去操作Redis,也会去通知看门狗系统,而看门狗系统会每隔释放时间(redisson默认30秒)/3去给锁续期,希望业务完成之前不要因为锁到期而引发线程安全问题,此时线程1执行完,线程2获取到锁就可以继续执行了。而加锁和设置过期时间都是基于lua脚本完成的,这样可以保证操作的原子性。

可重入性:

假设下图是线程1所执行的代码,在redis当中会按照哈希结构去进行存储,key为锁的key,value会存储一个键值对,键为线程名称,value为锁的次数默认为0,加一次锁就+1,释放一次锁就-1.

如上图,执行add1( )时,Thread1第一次加锁时,value会被改成1,当add2( )想获取锁时,此时Redis会进行判断,你是不是线程1来的,发现add2( )的线程名为Thread1,那么此时该锁可以重入的,value值会变成2,当add2( )执行完以后,释放锁,value又变为1,add1( )执行完以后,value变成0,此时的锁才是真正被线程1所释放了。

主从一致性(性能差):

如图,如果是在集群模式下的Redis服务器势必会有主节点和从节点,当线程1过来获取到一把锁时,主节点刚好宕机了,集群又重新选了一个主节点,线程2此时又获取到了和线程1同样的一把锁,这样就会产生锁冲突的现象。

针对这样的情况就要加红锁(RedLock):在多个Redis实例上加锁,而不是只在一个节点上进行加锁,这样就可以避免锁重复。

但是这样实现相对来说比较复杂,因此AP思想和CP思想(zookeeper)可以解决该问题。

所以说性能和复杂是负相关的。

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

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

相关文章

阅读笔记——《未知协议状态机推断技术研究综述》

【参考文献】盛嘉杰, 牛胜杰, 陈阳, 等. 未知协议状态机推断技术研究综述[J]. 计算机与现代化, 2023 (05): 58.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 摘要 协议逆向工程(PRE)描述了协议的行为逻辑&#xff…

spring cloud config server源码学习(一)

文章目录 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…

shell命令运行原理及Linux权限问题

目录 shell命令以及运行原理用户管理添加用户删除用户sudo Linux权限的概念Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法文件访问权限的相关设置方法 目录的权限粘滞位 shell命令以及运行…

备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析(持续)

多做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一,通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。 今天我们继续…

PostgreSQL基本使用Schema

参考文章:PostgreSQL基本使用(3)Schema_pg数据库查询schema-CSDN博客 PostgreSQL 模式(Schema)可以理解为是一个表的集合(或者所属者)。 例如:在 MySQL 中,Scheam 是库&…

HLS视频加密,让您的视频内容更安全!

背景介绍 HLS视频加密是一种基于HTTP Live Streaming(HLS)协议的加密技术。它的核心思想是将视频切片进行加密处理,在客户端播放时需要先获取解密密钥才能正常偶发。通过这种方式,HLS加密可以有效防止未经授权的第三方窃取视频内…

LLM大模型的7种推理框架分析

LLM的7种推理框架 Hugging Face的transformers 这是一个Python库,可以简化本地运行LLM的过程。 Transformers的优点: 自动模型下载提供代码片段非常适合实验和学习 Transformers的缺点: 需要对ML和NLP有深入了解需要编码和配置技能 2.L…

深度学习之基于Tensorflow低光增强的深层Retinex分解

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域,低光照环境下的图像增强是一个具有挑战性的问题。为了提高图像的可…

纽曼新品X1000:轻巧便携仅重9.9公斤的1度电应急电源

在户外救援行动和应急设备中,电力供应的稳定性和安全性直接影响到救援工作的效率和成功率。在现代救援工作中,常见的光学声波探测仪、通信联络设备、气象检测仪、生命探测仪、照明设备等装备均需有持续的电力供应,才能保障救援工作的有序开展…

西门子WINCC8.0VBS脚本学习讲解

WinCC VBS脚本置位/复位/取反 二进制变量 "TAG1_BOOL1" 进行置位复位取反操作 步骤:按钮-->对象属性-->事件-->单击鼠标VBS动作填入代码如下: 对二进制变量进行复位 对二进制变量进行置位 对二进制变量进行取反 VBS脚本数学运算/读写批处理 …

第十六讲:数据在内存中的存储

第十六讲:数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…

如何将数据从一部手机传输到另一部手机[安全快速]

概括 手机之间无需使用蓝牙即可传输文件,配合专业的文件传输工具更高效。本文将向您介绍几种使用不同的数据传输工具快速安全地将数据从一部手机传输到另一部手机的方法,特别是当有大文件或大量文件时。现在,我们来看看。 需要在朋友或家人之…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

校园二手书交易|基于SprinBoot+vue的校园二手书交易管理系统(源码+数据库+文档)

校园二手书交易管理系统 目录 基于SprinBootvue的校园二手书交易管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3 卖家用户功能模块 4 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

基于springboot+html的二手交易平台(附源码)

基于springboothtml的二手交易平台 介绍部分界面截图如下联系我 介绍 本系统是基于springboothtml的二手交易平台,数据库为mysql,可用于毕设或学习,附数据库 部分界面截图如下 联系我 VX:Zzllh_

在家庭影院音频中应用的D类音频放大器

家庭影院的主要组成部分包括显示设备、音响设备、信号源和接线设备等。家庭影院的音响信号需要进行处理和输出,以获得高质量的音效。音响设备通常需要一台功率适当的数字、模拟混合的处理器,对音源进行降噪、均衡、扩展等处理操作,以达到高品…

【智能算法应用】北方苍鹰算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】北方苍鹰优化算法(NGO)原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出,障碍物的栅格用黑色表示,可通过的…

ping 探测网段哪些地址被用

#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…

使用Word表格数据快速创建图表

实例需求:Word的表格如下所示,标题行有合并单元格。 现在需要根据上述表格数据,在Word中创建如下柱图。如果数据在Excel之中,那么创建这个图并不复杂,但是Word中就没用那么简单了,虽然Word中可以插入图表&a…

014_C标准库函数之<stdio.h>

【背景】 今天这个主要说的是<stdio.h>头文件&#xff0c;大家众所周知&#xff0c;这个是我们学习C语言时第一个接触到的头文件了&#xff0c;那么为什么我不一开始就介绍这个头文件呢&#xff1f;我觉得有两个原因&#xff0c;如下&#xff1a; 1.一开始大家的编程思…