Redis分布式锁如何实现——简单理解版
目录
前言
满足条件
加锁之后产生的问题
避免死锁的方法
Lua脚本实现避免释放其他锁
看门狗判断过期
扩展
Lua脚本
Redission
前言
在如今开发的某些项目中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的,分布式锁发展至今,已经有越来越多的项目普及了,也已经被面试官拿出来提问,所以今天我们可以一起来学习一下分布式锁
满足条件
想要实现分布式锁,前提就需要满足如下几个条件
-
互斥性,在任意时刻,只有一个客户端能持有锁
-
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端可以加锁
-
加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁
-
具有容错性。只要大多数Redis节点正常运行,客户端就能获取和释放锁
Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则set)的简写,我们使用Redis时,一般会采用主从集群+哨兵的模式部署,哨兵的作用就是监测redis节点的运行状态。普通的主从模式,当master崩溃时,需要手动切换让slave成为master,使用主从+哨兵结合的好处在于,当master异常宕机时,哨兵可以实现故障自动切换,把slave提升为新的master,继续提供服务,以此保证可用性。
加锁之后产生的问题
但是当加上锁之后,就会有新的问题产生出来,当Redis或者客户端突然运行异常,或者突然宕机之后,我们添加的锁无法及时释放出来;又或者是我们执行程序时突然业务逻辑错误,无法释放出锁,那么就会导致后续操作无法进行,出现死锁的情况这个时候我们就需要想方法来解决如何避免死锁了
避免死锁的方法
如果要避免死锁,我们首先就是想到的Redis可以设置过期时间,让这个进程在规定时间之后就可以自己释放掉,从而避免了死锁的风险,这个时候我们就又有了新的问题——你怎么知道你释放的锁是你想释放的锁,你怎么知道他什么时候不用了,你要释放它。这个时候我们又会认识到两个新成员了:Lua脚本和看门狗
Lua脚本实现避免释放其他锁
首先知道Redis是单线程执行的,当执行一个线程时其他线程都无法执行,所以我们可以写一个lua脚本,在脚本里先试用GET请求,利用Redis键值对的特性根据i线程id获取到自己那条线程,然后执行SET命令(强制获取到锁,执行这条命令的概率很低),最后执行DEL命令删除线程,从而避免删除掉其他线程
看门狗判断过期
在Redis中,开发者已经想到这个情况,所以Redis里面已经改有一个很好的方法判断过期了,他就是redission(看门狗),Redisson是一个Java语言实现的Redis SDK客户端,在使用分布式锁时,它就采用了自动续期的方案来避免锁过期,这个守护线程我们一般叫它看门狗线程。这个SDK提供的API非常友好,它可以像操作本地锁一样操作分布式锁。客户端一旦加锁成功,就会启动一个watch dog看门狗线程,它是一个后台线程,会每隔一段时间(这段时间的长度与设置的锁的过期时间有关)检查一下,如果检查时客户端还持有锁key(也就是说还在操作共享资源),那么就会延长锁key的生存时间。
想到这些问题,Redis分布式锁大家应该就理解了
扩展
Lua脚本
lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
想要了解更多可以去Redis 使用lua脚本最全教程_redis lua语法-CSDN博客中了解更多
Redission

相关文章:
Redis分布式锁如何实现——简单理解版
目录 前言 满足条件 加锁之后产生的问题 避免死锁的方法 Lua脚本实现避免释放其他锁 看门狗判断过期 扩展 Lua脚本 Redission 前言 在如今开发的某些项目中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的,分布式…...
数字化转型驱动卫生用品安全革新
当315晚会上晃动的暗访镜头揭露卫生巾生产车间里漂浮的异物、纸尿裤原料仓中霉变的碎屑时,这一触目惊心的场景无情地撕开了“贴身安全”的遮羞布,暴露的不仅是部分企业的道德缺失,更凸显了当前检测与监管体系的漏洞,为整个行业敲响…...
北京南文观点:品牌如何抢占AI 认知的 “黄金节点“
在算法主导的信息洪流中,品牌正在经历一场隐蔽的认知权争夺战,当用户向ChatGPT咨询"哪家新能源车企技术最可靠"时,AI调取的知识图谱数据源将直接决定品牌认知排序。南文乐园科技文化(北京)有限公司ÿ…...
分布式(一):CAPBASE理论
1 CAP理论 1.1 简介 CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。 在理论计算机科学中,CAP定理(CAP theorem&…...
自适应柔顺性策略:扩散引导控制中学习近似的柔顺
24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用,因为它可以在不确定的情况下平衡位置和力的并发控制。然而,当今的视觉运动策…...
python中所有内置类型
文章目录 数值类型序列类型集合类型映射类型布尔类型空类型代码汇总 在 Python 中,数据类型可分为内置数据类型和用户自定义数据类型。内置数据类型是 Python 解释器直接支持的类型 数值类型 整数(int):表示整数,可正…...
「Java-API帮助文档」
「Java-API帮助文档」,链接:https://pan.quark.cn/s/d7ced3b48f33 java.applet提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。java.awt包含用于创建用户界面和绘制图形图像的所有类。java.awt.color提供用于颜色空间的类。java…...
1204. 【高精度练习】密码
文章目录 题目描述输入输出样例输入样例输出数据范围限制CAC代码 题目描述 人们在做一个破译密码游戏: 有两支密码棒分别是红色和蓝色,把红色密码棒上的数字减去蓝色 密码棒上的数字,就是开启密码锁的密码。 现已知密码棒上的数字位数不超过…...
SVN简明教程——下载安装使用
SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库?② 创建目…...
“智改数转”新风口,物联网如何重构制造业竞争力?
一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接,江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划(2025-2027年)》,提出到2027年,全省制造业企业设备更新、工艺…...
从数据洪流到智能洞察:人工智能如何解锁大数据的价值?
引言:数据洪流时代,企业的机遇与挑战 在这个信息爆炸的时代,数据正以前所未有的速度增长。IDC预测,全球数据量将在未来几年内持续飙升,企业每天都会产生海量的用户行为数据、市场交易数据、设备传感数据等。理论上&…...
蓝桥杯 之 数论
文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...
SpringBoot的启动原理?
大家好,我是锋哥。今天分享关于【SpringBoot的启动原理?】面试题。希望对大家有帮助; SpringBoot的启动原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot的启动原理主要是通过 SpringApplication 类来…...
从零开始搭建向量数据库:基于 Xinference 和 Milvus 的文本搜索实践
引言 在 AI 和大数据时代,向量数据库正成为处理非结构化数据(如文本、图像)的利器。最近,我尝试用 Xinference 和 Milvus 搭建一个简单的文本搜索系统,从读取本地文本文件到实现交互式查询和高亮显示匹配结果…...
音视频系列——Websockets接口封装为Http接口
模型服务示例:实时语音转文本服务 本示例展示一个支持双协议(WebSocket流式接口HTTP同步接口)的语音转文本模型服务,并提供将WebSocket接口封装为HTTP接口的代码实现。 一、服务架构设计 #mermaid-svg-nw0dMZ4uKfS4vGZR {font-fa…...
scrapy入门(深入)
Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。 新建项目 (scrapy startproject xxx):新建一个新的…...
docker模拟Dos_SYN Flood拒绝服务攻击 (Ubuntu20.04)
目录 ✅ 一、实验环境准备(3 个终端) 👉 所以最终推荐做法: 2️⃣ 配置 seed-attacker 为攻击者,开启 telnet 服务: 3️⃣ 配置 victim-10.9.0.5 为受害者服务器,开启 telnet 客户端并监听&…...
使用 Ansys Fluent 评估金属管道腐蚀
金属管道的维护和完整性在石油和天然气、石化和供水等各个行业中都至关重要。腐蚀对这些管道构成了重大威胁,可能导致泄漏、结构故障和环境危害。Ansys Fluent 提供了一个强大的平台来建模和分析金属管道腐蚀。 腐蚀是一种自然过程,金属材料会因与环境发…...
firefly经典蓝牙和QProcess、QFileSystemWatcher记录
QProcess 默认不会启动一个 shell 来解析命令,而是直接调用操作系统的系统调用来启动外部程序。也就是通过fork一个子线程或者exec一个子进程来执行命令。 QProcess的参数模式 QProcess 需要明确指定命令的可执行文件路径或参数列表。 如果命令是一个可执行文件的路径…...
基于PySide6的CATIA自动化工具开发实战——空几何体批量清理系统
一、功能概述 本工具通过PySide6构建用户界面,结合PyCATIA库实现CATIA V5的自动化操作,提供两大核心功能: 空几何体清理:智能识别并删除零件文档中的无内容几何体(Bodies)空几何图形集清理࿱…...
Blender配置渲染设置并输出动画
在Blender中,渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤: 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板(按 N 键可切换显示)。 点击 “输出属性” 选项卡(图标是…...
Spring 声明式事务应该怎么学?
1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写,它的设计如此巧妙,以至于在使用中几乎感觉不到它的存在,只需要优雅地加一个 Transactional 注解,一切就都顺理成章地完成了! 毫不夸张地讲ÿ…...
C++11 引入了的新特性与实例说明
C11 引入了许多重要的新特性,以下是一些关键特性及其对应的示例代码,用于体现这些特性的用法和优势。 1. 自动类型推导 (auto) auto 关键字允许编译器自动推导变量的类型,简化代码书写。 #include <iostream> #include <vector>…...
二手Mac验机过程
1.1 外观检查 螺丝是否拧过螺丝 1.2 关于本机中 序列号,盒子序列号,机器背部 核对参数 https://checkcoverage.apple.com/coverage 1.3 检查apple ID与查找 1 登出 iCloud、iTunes、FaceTime、iMessage 在 Mac 上打開「訊息」應用程式,從上方…...
从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)
最近我在研究 HarmonyOS 音频开发。在音视频领域,鸿蒙的 AudioKit 框架提供了 AVPlayer 和 AudioRenderer 两种方案。AVPlayer 适合快速实现播放功能,而 AudioRenderer 允许更底层的音频处理,适合定制化需求。本文将以一个开发者的自学视角&a…...
Android 13深度定制:SystemUI状态栏时间居中显示终极实战指南
一、架构设计与技术解析 1. SystemUI状态栏核心布局机制 层级结构 mermaid 复制 graph TDPhoneStatusBarView --> StatusBarContents[status_bar_contents]StatusBarContents --> LeftLayout[status_bar_left_side]StatusBarContents --> ClockLayout[Clock控件]Left…...
支持多系统多协议且可提速的下载工具
在网络下载需求日益多样的当下,一款好用的下载器能极大提升效率。今天就给大家介绍 AB Download Manager,它免费又开源,能适配 Windows 和 Linux 系统,带来超便捷的下载体验。 AB Download Manager 采用先进的多线程技术…...
【leetcode hot 100 22】括号生成
解法一:(回溯法)用两个整数记录左右括号数,以在回溯过程中保证先生成左括号,且左右括号数不能大于n。 class Solution {public List<String> generateParenthesis(int n) {List<String> result new Arra…...
如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?
大白话如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同? 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里,列表是一种用来组织信息的方式。有序列表就是带有编号的列表,它可以让内容按照一定的顺序呈现&#…...
【武汉·4月11日】Parasoft联合光庭信息研讨会|邀您共探AI赋能新机遇
Parasoft联合光庭信息Workshop邀您共探AI赋能新机遇 AI浪潮已至,你准备好了吗? 在智能网联汽车飞速发展的今天,AI技术正以前所未有的速度重塑行业生态。如何把握AI机遇,赋能企业创新? 4月11日,自动化软件…...
