【redis学习笔记】分布式锁

news2024/11/24 16:54:38

什么是分布式锁

以往的锁都是只能在当前进程中⽣效, 在分布式的这
种多个进程多个主机的场景下就⽆能为⼒了。
因此提供分布式锁,加锁就是往redis上设置一个特殊的key:value,完成操作后,释放锁就是删除这个key:value;其他服务器尝试加锁时,也就是设置key:value时,如果发现该key:value对已经存在,就认为加锁失败
在这里插入图片描述

刚才买票场景,使用 mysql 的事务也可以批量执行 查询 + 修改 操作但是分布式系统中,要访问的共享资源不一定是 mysql…
t也可能是其他的存储介质没有事务.也可能是执行一段特定的操作,是通过统一的服务器完成执行动作…

过期时间设置

为了解决某个拿到锁的服务器突然宕机,导致不能释放锁,别的服务器永远拿不到锁的情况,需要给redis设置过期时间。
可以通过 set ex nx 命令设置,设置 key 的过期时间,为 1000ms 那么意味着即使出现极端情况,某个服务器挂了,没有正确释放锁。这个锁最务保持 1000ms,也就会自动释放。
注意⚠️在这里插入图片描述

校验ID

因为分布式锁的加锁和解锁操作本质就是设置一个key:value和删除一个key:value,因此可能因为代码考虑不周全,出现一个服务器A加锁了,另一个服务器B把锁给解了。
因此可以引入校验机制,谁加到锁,谁来解锁。

方案:

  1. 给服务器编号,每个服务器有自己的身份id
  2. 加锁设置key:value时,key可以是被加锁的资源name,value设置成加锁服务器的id
  3. 后续解锁时进行校验,先查询一下这个锁对应的服务器编号,判断这个id是不是当前想要解锁的服务器的id,是,就执行del解锁,不是,就判定解锁失败。(服务器上的逻辑代码
String key = [要加锁的资源 id];
String serverId = [服务器的编号];
// 加锁, 设置过期时间为 10s
redis.set(key, serverId, "NX", "EX", "10s");
// 执⾏各种业务逻辑, ⽐如修改数据库数据.
doSomeThing();
// 解锁, 删除 key. 但是删除前要检验下 serverId 是否匹配.
if (redis.get(key) == serverId) {
 redis.del(key);
}

lua脚本

在这里插入图片描述
在这里插入图片描述
出现以上问题的本质是因为getdel操作不是原子的;因此引入lua脚本(lua是一个编程语言,redis可以内嵌lua)

if redis.call('get',KEYS[1]) == ARGV[1] then
 return redis.call('del',KEYS[1])
else
 return 0
end;

过期时间的续约(看门狗)

所谓 watch dog, 本质上是加锁的服务器上的⼀个单独的线程, 通过这个线程来对锁过期时间进⾏ “续约”。
注意, 这个线程是业务服务器上的, 不是 Redis 服务器的

Redlock 算法

存在一种情况,服务器加锁时给redis的master写入了key:value,但是在同步数据前master挂了,哨兵选举一个slave作为新的master,但此时没有刚刚服务器设置的key:value,就出现,明明我加锁了却说现在没加上的情况。
在这里插入图片描述
按照顺序进行加锁,当加锁成功的节点数超过总节点数的⼀半, 才视为加锁成功,这样的话, 即使有某些节点挂了, 也不影响锁的正确性。解锁时,也都会设置一遍del

那么是否可能出现上述节点都同时遇到了 “⼤冤种-都失败” 情况呢? 理论上这件事是可能发⽣的, 但是概率太⼩了。⼯程上就可以忽略不计了

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

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

相关文章

数据结构——多重链表的实现

//多重列表的实现 #include<stdio.h> #include<stdlib.h> struct lnode {int row,col,value; }; //没有用到down指针 //没有用到tag和next指针 typedef struct node {int tag;//区分头结点(0)和非零元素结点(1)struct node* right;struct node* down;//共用体与结…

达梦数据库 视图 错误 [22003]: 数据溢出

今天通过DBeaver连接访问达梦数据库的一个视图&#xff0c;报错&#xff1a;错误 [22003]: 数据溢出 经过分析&#xff0c;原因是视图字段的数据类型和原表的数据类型不一致造成的

加密密钥应用范围及特点优势分析

加密密钥是一种用于保护数据和信息安全的重要工具。它通过在数据传输和存储过程中对数据进行加密&#xff0c;使得未经授权的人无法访问和解读数据。加密密钥的应用范围广泛&#xff0c;包括网络通信、电子商务、金融交易、数据存储等领域。安策将对加密密钥的应用范围和特点优…

AP2400 LED电源驱动 降压恒流IC 机场灯 指示灯 交通照明灯

产品描述 AP2400 是一款 PWM 工作模式,高效率、外围简单、外驱功率管&#xff0c;适用于 5-100V输入的高精度降压 LED 恒流驱动芯片。外驱 MOS&#xff0c;最大输出电流可达 6A。AP2400 可实现三段功能切换&#xff0c;通过MODE1/2/3 切换三种功能模式&#xff1a;全亮&#xf…

PyQt5配置踩坑

安装步骤比较简单&#xff0c;这里只说一下我踩的坑&#xff0c;以及希望一些大佬可以给点建议。 一、QtDesigner 这个配置比较简单&#xff0c;直接就能用&#xff0c;我的配置如下图&#xff1a; C:\Users\lenovo\AppData\Roaming\Python\Python311\site-packages\qt5_app…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

海外网红营销:打造热门短视频的秘诀

在当今数字化时代&#xff0c;短视频已成为社交媒体上最热门的内容形式之一。无论是TikTok、Instagram、YouTube还是其他平台&#xff0c;短视频都吸引了海内外网红和品牌的注意。本文将详细探讨海外网红营销中如何打造爆款短视频&#xff0c;以便帮助品牌在竞争激烈的市场中脱…

一些常见分布-正态分布、对数正态分布、伽马分布、卡方分布、t分布、F分布等

目录 正态分布 对数正态分布 伽马分布 伽马函数 贝塔函数 伽马分布 卡方分布 F分布 t分布 附录 参考文献 本文主要介绍一些常见的分布&#xff0c;包括正态分布、对数正态分布、伽马分布、卡方分布、F分布、t分布。给出了分布的定义&#xff0c;推导了概率密度函数&…

Python实现JavaScript中AES加密有关填充问题

1. 先展示一下JS端的格式&#xff08;没找到没混淆的。。。&#xff0c;将就看吧&#xff09; 2. 在python加密中是没有选择填充模式的&#xff0c;需要自己来填充 3. 对加密不懂的朋友可能跟我一样刚开始很懵逼&#xff0c;因为遇到的基本都是pksc7填充模式&#xff0c;但是网…

解析图片文件格式

图片文件幻数 关于JPEG格式 二进制形式打开文件&#xff0c;文件开始字节为FF D8&#xff0c;文件结束两字节为FF D9 JPEG 文件有两种不同的元数据格式&#xff1a;JFIF 和 EXIF。 JFIF 以 ff d8 ff e0 开头&#xff0c;EXIF 以 ff d8 ff e1 开头。 代码示例 private static…

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…

六、循环表达式

6.1 循环表达式语法 thymeleaf使用th:each属性可以对数组&#xff0c;集合进行循环&#xff0c;此属性用在容器元素上&#xff0c;循环生成子元素。 语法 th:each"循环出的元素 , 循环状态 : 集合或数组" .6.2、数组的循环 示例 在TestServlet中定义一个数组 …

Vue中如何进行自定义动画与动画效果设计(如CSS动画、Web动画)

当我们构建现代的Web应用程序时&#xff0c;动画和过渡效果变得越来越重要。它们可以增强用户体验&#xff0c;使用户界面更具吸引力&#xff0c;并帮助用户更好地理解应用程序的功能。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了许多强大的工具和功能&#xff0c;使…

大数据技术标准推进委员会发布《地球大数据白皮书(2023年)》

导读 地球大数据的应用领域范围广阔&#xff0c;包括生态保护、自然资源管理、气象服务、城市规划、应急容灾等方面&#xff0c;但目前仍处于发展初期&#xff0c;面临着数据来源、结构多样&#xff0c;数据管理门槛高&#xff0c;数据应用场景复杂、落地方法论较少等痛点。如…

Linux系统常用指令篇---(三)

Linux系统常用指令篇—(三) 1.tree指令 ​ tree这条指令需要安装,不是自带就有的. 安装指令:yum -y install tree作用: ​ 以树状图的形式展开目录 2.which指令 which命令用于查找文件 指令在本质上就是可执行程序,因此也属于文件 3.cp指令 语法&#xff1a; cp [选项] …

【力扣每日一题】2023.10.7 股票价格跨度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示不同时间的股票的价格&#xff0c;要我们按照顺序返回每天的股票价格跨度&#xff0c;价格跨度就是股票价格小于或等于…

如何批量获取京东商品详情数据,京东商品详情API接口

批量获取京东商品详情数据可以通过京东开放平台接口来实现。 首先&#xff0c;您需要在京东开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。然后&#xff0c;使用获取到的App Key和App Secret进行签名和认证&#xff0c;获取Access…

前后端分离计算机毕设项目之基于SpringBoot的旅游网站的设计与实现《内含源码+文档+部署教程》

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

基于SSM+Vue的订餐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

每日一题 2034. 股票价格波动(中等,有序队列)

思路&#xff1a; 对于最高和最低价格&#xff0c;维护一个有序的存储所有价格的队列即可实现当执行 update 时&#xff0c;将队列中原来的 price 删除&#xff08;如果有的话&#xff0c;且耗时O(logn)&#xff09;&#xff0c;然后再插入新的 price 并保持有序&#xff08;耗…