redis分布式锁的学习记录

核心性质

独占性:对于同一把锁,同一时刻只能被一个加锁方独占
健壮性:不能产生死锁。如果有一个因为宕机无法主动解锁,锁也应该被正常加载
对称性:加成和解锁的使用方必须为同一个身份,不允许被非方释放
高可用:当提供分布式锁服务的基础组件中存在少量节点发生故障时,不应该影响到分布式锁服务的稳定性

实现类型

对 cpu 空转以及阻塞协程两种行为的损耗做出权衡

主动轮询型:该模型类似于单机锁中的主动轮询 + cas 乐观锁模型,取锁方会持续对分布式锁发出尝试获取动作,如果锁已被占用则会不断发起重试,直到取锁成功为止
watch 回调型:在取锁方发现锁已被他人占用时,会创建 watcher 监视器订阅锁的释放事件,随后不再发起主动取锁的尝试;当锁被释放后,取锁方能通过之前创建的 watcher 感知到这一变化,然后再重新发起取锁的尝试动作

分布式场景中”轮询“,背后存在的行为可能是一次甚至多次网络 IO 请求.但是,watch 机制在实现过程中需要建立长连接完成 watch 监听动作,也会存在一定的资源损耗

主动轮询型

针对同一把分布式锁,用同一条数据标识(redis中的string同一个key对应的value)
假如在插入之前不存在数据,插入成功,则被认定为加锁
把从存储介质中删除类比成解锁动作
假如在插入之前存在,则持续轮训,直到数据被删除,并有自己插入成功
由于是并发场景,需要保证【 (1)检查数据是否已被插入(2)数据不存在则插入数据 】这两个步骤之间是原子化不可拆分的(在 redis 中是 set only if not exist —— SETNX 操作)

死锁问题

使用 redis 时,通过过期时间 expire time自动删除.
过期机制问题:锁的持有者并不能精确预判到自己持锁后处理业务逻辑的实际耗时,假如因为一些异常情况导致占有锁的使用方在业务处理流程中的耗时超过了设置的过期时间阈值,就会导致锁被提前释放,其他取锁方可能取锁成功,最终引起数据不一致的并发问题.
解决方案:在锁的持有方未完成业务逻辑的处理时,会持续对分布式锁的过期阈值进行延期操作.

弱一致性问题

redis是ap形式,为保证服务的吞吐性,主从节点之间的数据同步是异步延迟进行。
问题 :倘若 使用方 A 在 redis master 节点加锁成功,但是对应的 kv 记录在同步到 slave 之前,master 节点就宕机了. 此时未同步到这项数据的 slave 节点升为 master,这样分布式锁被 A 持有的“凭证” 就这样凭空消失了. 于是不知情的使用方 B C D 都可能加锁成功,于是就出现了一把锁被多方同时持有的问题,导致分布式锁最基本的独占性遭到破坏.

watch 回调型

差别在于

倘若在插入数据时,发现该条记录已经存在,说明锁已被他人持有,此时选择监听这条数据记录的删除事件,当对应事件发生时说明锁被释放了,此时才继续尝试取锁

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

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

相关文章

HCIA-实验命令基础学习:

视频学习: 第一部分:基础学习。 19——子网掩码。 27——防火墙配置: 32——企业级路由器配置: 基础实验完成:(完成以下目录对应的实验,第一部分基础实验就完成。) 方法&#xff…

C //习题 8.13 写一个用矩形法求定积分的通用函数,分别求

C程序设计 (第四版) 谭浩强 习题8.13 习题 8.13 写一个用矩形法求定积分的通用函数,分别求 ∫ 0 1 s i n x d x , ∫ 0 1 c o s x d x , ∫ 0 1 e x d x \int_{0}^{1}sinx\ dx,\ \ \int_{0}^{1}cosx\ …

ILI9225 TFT显示屏16位并口方式驱动

所用屏及资料如后图: ILI9225,176*220,8位或16位并口屏,IM0接GND,电源及背光接3.3v 主控:CH32V307驱动(库文件和STM32基本一样) 一、源码 ILI9225.c #include "ILI9225.h&quo…

设计模式(二)-创建者模式(4)-原型模式

一、为何需要原型模式(Prototype Pattern)? 在软件设计中,我们会遇到到这样的情况:对原对象进行拷贝一个新的副本。想要实现这样的逻辑,有一种笨方法就是对原对象里的所有变量进行逐一赋值。但是这样的做法会导致代码…

【SpringCloud】认识微服务、服务拆分以及远程调用

SpringCloud 1.认识微服务 1.1单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 单体架构的优缺点: **优点:**架构简单,部署成本低 **缺点:**耦合度高(维护困难&…

【C++】郭老二博文之:C++目录

1、POCO 【POCO】POCO学习总结(一)–下载与编译 【POCO】POCO学习总结(二)——配置选择 【POCO】POCO学习总结(三)——交叉编译 2、C11 2.1 STL算法 【C】C11 STL算法(一):非修改序列操作&a…

笔记59:序列到序列学习Seq2seq

本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章:动手学深度学习~现代循环神经网络 a a a a a a a a a a a a a a a

C++ Day04 this指针,友元函数,重载

this指针 概念 谁调用 this 所在的函数 ,this 就存储谁的地址 特点 1, 在当前类的非静态成员函数中调用本类非静态成员时 , 默认有 this 关键字 2, 静态成员函数 , 没有 this 指针。 示例 #include <iostream> #include <cstring> using namespace std; class S…

前后端分离项目跨域请求的问题与解决办法

目录 一、为什么会存在跨域请求&#xff1f; 二、跨域请求的流程&#xff1f; 三、什么情况下会触发CROS机制&#xff1f; 四、如何解决跨域请求导致的问题&#xff1f; 一、为什么会存在跨域请求&#xff1f; 跨域请求是因为浏览器的同源策略引起的。同源策略是浏览器的一种…

算法刷题-动态规划2

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…

10.10-11 科研记录 一些多模态工作的相关思考

论文出发点很简单&#xff0c;第一&#xff0c;就是想要去除文本的冗余数据&#xff0c;有多篇文章也提到了&#xff0c;冗余文本影响对下游任务的性能&#xff0c;大量无关的文本输入到大模型也会影响大模型的性能&#xff0c;本质也很好理解&#xff0c;就是尽可能去除与任务…

握住音乐的法宝 - 简谱

简谱是音乐学习中至关重要的记谱法。除了简谱&#xff0c;还有吉他和钢琴的五线谱&#xff0c;以及我最喜欢的古琴减字谱等其他记谱方式。如果你对音乐感兴趣&#xff0c;一起学习吧&#xff0c;我不允许你是一个文盲。 一、调拍号 “1C 4/4”即为调拍号&#xff0c;调拍号分…

opencv-直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过调整图像的灰度级别分布&#xff0c;使得图像中各个灰度级别的像素分布更均匀&#xff0c;从而提高图像的对比度。 在OpenCV中&#xff0c;你可以使用cv2.equalizeHist()函数来进行直方图均衡化。 以下是一个简单…

opencv-2D直方图

cv2.calcHist() 是 OpenCV 中用于计算直方图的函数。它可以计算一维或多维直方图&#xff0c;用于分析图像中像素值的分布。 基本的语法如下&#xff1a; hist cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数说明&#xff1a; images:…

[点云分割] 条件欧氏聚类分割

介绍 条件欧氏聚类分割是一种基于欧氏距离和条件限制的点云分割方法。它通过计算点云中点与点之间的欧氏距离&#xff0c;并结合一定的条件限制来将点云分割成不同的区域或聚类。 在条件欧氏聚类分割中&#xff0c;通常会定义以下两个条件来判断两个点是否属于同一个聚类&…

Java继承中的属性名相同但是类型不同的情况

如果子类出现一个属性与父类的属性名一样,那么父类的属性将会被隐藏(java官方文档) 在继承当中,子类继承父类的属性和继承方法的方式上有所差别: 父类属性不可被重写,只会被调用,父类方法可以被重写,也可以被调用 当子类中存在和父类同名属性,父类属性会隐藏起来,在多态的情…

利用Python进行数据分析【送书第六期:文末送书】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

vue实现爱心形状的复选框

目录 HTML代码&#xff1a; CSS代码&#xff1a; Vue代码&#xff1a; 这个例子使用了CSS来创建一个爱心形状的复选框&#xff0c;并使用Vue来控制其选中状态。点击复选框时&#xff0c;将调用toggleChecked方法来切换checked属性的值&#xff0c;以控制复选框的状态。 以下…

7.vue3项目(七):品牌管理页面的增删改查

目录 1.静态页面 2.查询功能实现 (1)设置出参入参类型 (2)编写查询接口