Redis中的分布式锁及其延生的问题

前言

本文将着重介绍Redis中的分布式锁及其与出现的死锁和锁误删问题

什么是分布式锁

首先问题就是什么是分布式锁,分布式锁就是分布式系统中实现并发控制的一种锁机制,它可以保证多个节点在同一个时间只有有一个能成功竞争到系统资源(共享资源或执行关键代码),防止造成并发安全问题。图示如下:
在这里插入图片描述

Redis中的分布式锁

在Redis中分布式锁使用 setnx (set if no exists) 实现,当我们使用setnx创建锁的时候,成功则返回1,否则返回0

127.0.0.1:6379> setnx lock true
(integer) 1 #创建锁成功
#逻辑业务处理...
127.0.0.1:6379> del lock
(integer) 1 #释放锁5

当我们进行重复加锁时,会出现下面这种情况:

127.0.0.1:6379> setnx lock true # 第一次加锁
(integer) 1
127.0..1:6379> setnx lock true # 第二次加锁
(integer) 0

Redis中的分布式锁问题

死锁问题

一个很明显的问题是,假如我上锁并且没有设置过期时间,但是忘记释放锁了,就会造成死锁问题,系统资源一直无法释放,应用无法正常执行,那么要怎么解决这个问题呢???
如果我们在上锁后对其进行设置超时时间,那么上锁和设置时间这个两个操作并不是原子性的,还是会存在并发安全问题。

在后续的Redis2.6.12版本之后,新增了了一个expire,setnx可以和他搭配使用,做到原子性的上锁和设置超时时间

127.0.0.1:6379> set lock true ex 30 nx
OK #创建锁成功
127.0.0.1:6379> set lock true ex 30 nx
(nil) #在锁被占用的时候,企图获取锁失败

其中 ex 为设置超时时间, nx 为元素非空判断,用来判断是否能正常使用锁的。

锁误删问题

在出现expire命令和setnx命令组合使用可以解决死锁问题后,出现了新的问题锁误删问题

锁误删问题就是一个应用在获取锁后,他执行任务的时间超过了设置的超时时间,锁就会被其他应用争取到,但是当前应用任然在进行,当当前应用在执行结束后,执行了del lock命令就会把锁释放掉,那么其他线程刚刚竞争到的锁又会被其他应用争取到,恶性循环下去。图示如下:
在这里插入图片描述
如果要解决锁误删问题,就需要我们在设置锁的时候,多设置版本号,就解决跟CAS锁中ABA一样。

127.0.0.1:6379> set lock thread ex 30 nx
OK #创建锁成功

这里面thread1就是锁归属线程的标识,我们在进行删除锁的时候后,需要进行判断+删除就能解决一个误删问题了

但是新的问题又出现了,重点还是判断+删除它并不是原子性的,所以为了解决这个原子性问题,可以使用lua脚本或者Ression框架下来解决。具体可以去翻阅资料,这里就不做过多赘述。

以上就是本文的全部内容
感谢阅读

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

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

相关文章

LeetCode算法递归类—二叉树中的最大路径和

目录 124. 二叉树中的最大路径和 - 力扣(LeetCode) 题解: 代码: 运行结果: 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该…

Hive无法启动的解决方案

关掉虚拟机后,重新启动后,按照Hadoop和Hive的流程重新启动,发现无法启动成功,特别是元数据服务无法启动,出现以下错误: Exception in thread “main” java.lang.RuntimeException: java.net.ConnectException: Call F…

华为OD真题--分月饼--带答案

1. 华为OD机考题 答案 2023华为OD统一考试(AB卷)题库清单-带答案(持续更新) 2023年华为OD真题机考题库大全-带答案(持续更新) 2. 面试题 一手真实java面试题:2023年各大公司java面试真题汇总--…

基于Opencv的虚拟拖拽项目

预备知识 勾股定理 跟随移动算法 手势识别图解 项目源代码 """ 演示一个简单的虚拟拖拽 步骤: 1、opencv 读取视频流 2、在视频图像上画一个方块 3、通过mediapipe库获取手指关节坐标 4、判断手指是否在方块上 5、是,方块跟着移动 6、…

LeetCode1048 最长字符串链

思路 从短到长,增加字母的话,有多个位置,并且每个位置都有26种选择,正难则反。选择从长到短,删除某个字母。删除字母得到的新字符串可能已经计算过,所以将计算的结果都记录一下。记忆化搜索: 先…

密码学学习笔记(十九):密码学关键术语的解释1

数据加密标准(DES) 数据加密标准是使用最广泛的加密体制,它于1977年被美国国家标准和技术研究所(NIST)采纳为联邦信息处理标准FIPS PUB 46。 DES3DESAES明文分组长度(位)6464128密文分组长度(位)6464128密钥长度&…

开源Android apk转aab工具

功能 自动化将apk转为aab文件.自动化实现打包smali,签名,安装. 用法 配置文件(config.toml ) [sign] #"exec command: java -jar {} build-apks --bundle {} --output {} --ks {} --ks-pass pass:{} --ks-key-alias {} --key-pass pass:{}", config.jar.bundleto…

详解junit

目录 1.概述 2.断言 3.常用注解 3.1.Test 3.2.Before 3.3.After 3.4.BeforeClass 3.5.AfterClass 4.异常测试 5.超时测试 6.参数化测试 1.概述 什么是单元测试: 单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单…

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的…

【前端面试】中大文件上传/下载:中等文件代理服务器放行+大文件切片传输+并发请求+localstorage实现断点续传

目录 中等文件代理服务器放行:10MB为单位 proxy nginx 大文件切片:100MB为单位 断点:存储切片hash 前端方案A localstorage 后端方案B 服务端 上传 前端 后端 下载 前端 后端 多个大文件传输:spark-md5 哈希碰撞…

什么是Pytorch?

当谈及深度学习框架时,PyTorch 是当今备受欢迎的选择之一。作为一个开源的机器学习库,PyTorch 为研究人员和开发者们提供了一个强大的工具来构建、训练以及部署各种深度学习模型。你可能会问,PyTorch 是什么,它有什么特点&#xf…

JQuery快速入门教程

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库,就是一个 JS 文件,里面封装了很多预定义的函数,比如获取元素,执行隐藏、移动等,目的就 是在使用时直接调用,不需要再重复定义…

微机原理与接口技术 学习笔记(二) 存储器

文章目录 一,存储器1.1 概述1.1.1 半导体存储器的分类按制造工艺: 易失性或挥发性存储器 / 不易失性或不挥发性存储器按制造工艺: 1.1.2 半导体存储器的性能指标1.1.3 半导体存储器的一般结构及组成 1.2 随机存取存储器 RAM1.2.1 静态RAM1.2.…

【数据结构】_8.二叉树OJ

目录 1. 题目1:检查两棵树是否相同 2. 题目2:判断一棵树是否为另一棵树的子树 3. 题目3:翻转二叉树 4. 题目4:判断一棵树是否为平衡二叉树 5. 题目5:判断一棵树是否为对称二叉树 6. 题目6:二叉树的层序…

第二周晨考自测(2.0)

1.冒泡排序 冒泡排序是数组解构中的常见排序算法之一。规则如下:先遍历数组,让相邻的两个数据进行比较,如果前一个比后一个大,那么就把这两个数据交换位置,经过一轮遍历之后,最大的那个数字就排在数组最后…

UML图绘制 -- 类图

1.类图的画法 类 整体是个矩形,第一层类名,第二层属性,第三层方法。 :public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…

机器学习知识点总结:什么是GBDT(梯度提升树)

什么是GBDT(梯度提升树) 虽然GBDT同样由许多决策树组成,但它与随机森林由许多不同。 其中之一是GBDT中的树都是回归树,树有分类有回归,区分它们的方法很简单。将苹果单纯分为好与坏的是分类树,如果能为苹果的好坏程度打个分&…

pycharm上传项目到github,版本管理

前提:下载git 设置Git路径 登录Github 此时自动打开浏览器,并打开连接页面,点击 Authorize GitHub。登录: 创建本地仓库 提交到Github 填写初始提交相关信息 origin,它们只是远程服务器的一个别名,否则你就…

小程序前台Boot后台校园卡资金管理系统java web学校进销存食堂挂失jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 小程序前台Boot后台校园卡资金管理系统 系统有2权限&…

React Native expo项目修改应用程序名称

https://expo.dev/accounts/xutongbao/projects npm install --global eas-cli && \eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 app.config.js: export default {name: 学习,slug: learn-gpt,owner: x…