分布式锁的简单实现
1. 什么是分布式锁?
在分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,和 Java 中多线程的锁不一样,由于分布式系统中涉及到多个进程多个主机,所以说 Java 中 synchronized 就不合适了。
2. 分布式锁的简单实现
思路:使用一个公共的服务器来记录加锁的状态
可以用过 Redis 来记录一个键值来表示锁的状态,当加锁的时候就设置该键值对,释放锁时就删除,不过此时就有了一个问题,如果说服务器 1 加锁之后宕机了,那么释放锁的操作就无法执行,其他服务器就不能获取锁,所以说可以通过set ex nx的方式再设置一个过期时间,键值对的设置也是有讲究的,如果设置为一个简单的 “111”,那么其他服务器也能释放锁,此时可以引入一个校验 id,比如设置为服务器编号,通过判断是否是加锁的那台服务器来释放锁。
此时还有一个问题:校验 id 时需要通过 get 操作获取值,然后通过 del 操作删除锁,这样的操作并不是原子的,那么就会导致一台服务器加锁之后,其中的两个线程进行解锁操作,当线程 A 解锁完成后,线程 B 的 del 操作前的这段时间,服务器 2 加锁之后就被释放了

可以把释放锁的逻辑写在 Lua 脚本中执行,Lua 脚本在 Redis 中的执行是原子的
3. 引入“看门狗”
上述的方案中还存在一个问题:由于把 key 的过期时间设置为了一个定值,如果设置的过小,那么任务还没执行完,锁自动释放了,这就需要引入看门狗机制,watch dog 本质上是加锁的服务器上的一个单独的线程(不是 Redis 服务器的),通过这个线程来对锁过期时间进行续约,这样就不用担心提前失效的问题了,即使服务器宕机了,watch dog 线程也就没了,无法续约,到了一定时间自然就释放锁了
4. 引入 Redlock
在实际中,Redis 一般是集群部署的,就可能出现下面这种情况:
服务器 1 向 master 节点进行加锁操作,设置 key 的过程刚刚完成,master 节点就宕机了,slave 节点升级为了新的 master 节点,但是原来主节点设置的锁并没有来得及同步过来,此时就相当于服务器 1 的锁白加了。

可以引入多组 Redis 节点,每组 Redis 节点都包含一个主节点和若干从节点,并且组和组之间的数据都是一致的,加锁的时候,按照一定的顺序,写多个 master 节点,并且设定操作的超时时间,如果超过这个时间还没有加锁成功,就认为该节点加锁失败了,根据少数服从多数的原则,如果超过一半的主节点都加锁失败,才认为本次加锁失败,解锁也是这样的操作。
相关文章:
分布式锁的简单实现
1. 什么是分布式锁? 在分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,和 Java 中多线程的锁不一样,由于分布式系统中涉及到多个进程多个主机,所以说 Java 中 synchronized 就不合适了。 2. 分布式锁的简…...
C语言(19)----------->函数(2)
本文介绍了C语言的return语句及其它在C语言函数中的作用,以及介绍了二维数组和一维数组传参时的一些注意事项和使用数组传参时的方法。 若没有学习过C语言的一维数组和二维数组,建议参考如下文章: C语言(15)--------…...
动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
目录 一、典型案例:系统发布后的GC雪崩事件 (一)故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征:Allocation Failure (二)问题定位 二、原理深度解析:JVM内存弹…...
为何在用户注销时使用 location.href 而非 Vue Router 的 router.push
在开发 Web 应用时,用户注销功能的设计看似简单,但背后隐藏着对状态管理、安全性和用户体验的深层考量。以下将详细探讨为何许多项目在注销跳转时选择 location.href(强制刷新页面)而非 Vue Router 的 router.push(单页…...
开源工具推荐:Uptime Kuma监控
1. 概述 Github:louislam/uptime-kuma: A fancy self-hosted monitoring tool Uptime Kuma is an easy-to-use self-hosted monitoring tool. Uptime Kuma 是一款开源的监控工具,可以帮助你实时监测网站或服务的状态,并在发生故障时及时通…...
《基于Selenium的论坛系统自动化测试实战报告》
一、项目背景与技术选型 项目简介 目标系统:论坛系统 核心功能:用户注册/登录、会话框发送信息、好友列表、信息发送 技术栈:html Springboot MySQL数据库 为什么选择Selenium 支持多浏览器兼容性测试(Chrome/Firefox/Edge&…...
深入解析SQL Server高级SQL技巧
SQL Server 是一种功能强大的关系型数据库管理系统,广泛应用于各种数据驱动的应用程序中。在开发过程中,掌握一些高级SQL技巧,不仅能提高查询性能,还能优化开发效率。这篇文章将全面深入地探讨SQL Server中的一些高级技巧…...
分布式中间件:环境准备
在当今数字化的时代,分布式系统已经成为了开发领域的主流。分布式中间件在其中扮演着至关重要的角色,它能够帮助我们更好地处理高并发、高可用等复杂的业务场景。在这个系列的博客中,我将带大家深入学习分布式中间件的相关知识,主…...
c# winform程序 vs2022 打包生成安装包
最近,利用c# winform程序该客户开发一套进销存管理系统,项目在部署前,需要生成安装包,以便部署在客户电脑上面。总结步骤如下: 1、在打包之前 (VS中需要包括Microsoft visual studio installer projects扩展项目)&…...
探索Elasticsearch:文档的CRUD
在企业环境中,Elasticsearch对文档操作的支持不仅是实现高效搜索的关键,更是数据驱动决策的重要支柱。它通过强大的索引机制和灵活的查询语言,使企业能够实时处理和分析海量文档数据,迅速获取有价值的洞察,从而加速创新…...
面试基础--Spring Boot启动流程及源码实现
深度解析Spring Boot启动流程及源码实现 一、Spring Boot启动全景图(含核心阶段) #mermaid-svg-dYTQ6WPa3o6vKFHh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dYTQ6WPa3o6vKFHh .error-i…...
火语言RPA--PDF提取图片
【组件功能】:提取PDF文档指定位置图片 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取图片的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…...
力扣977.有序数组的平方(双指针)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 方法一:直接将每个元素的平方压入ans数组中,再对ans数组进行排序 class Solution { public:vector<int> sort…...
QT——文件IO
QFile 类 构造函数 QFile() 无参构造 仅仅构建一个QFile 对象,不设定文件名 QFile(文件名) 构建一个QFile对象的同时,设定文件名 但是注意,仅仅设定文件名,并不会打开该文件 设定文件名 QFile file file.setFileName…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
服务器和本地电脑之间如何传输文件
在服务器和本地电脑之间传输文件可以通过多种方式实现,常见的方法包括使用 SFTP(安全文件传输协议)、SCP(安全复制协议)、FTP(文件传输协议)、rsync、以及 云存储 等工具。以下是几种常见的方法…...
经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑
背景 对于一些内部使用的管理系统来说,可能没有引入Redis,又想基于现有的基础设施处理并发问题,而数据库是每个应用都避不开的基础设施之一,因此分享个我曾经维护过的一个系统中,使用数据库表来实现事务锁的方式。 之…...
嵌入式学习前要了解的基础知识
一、电压和电流 在嵌入式开发中,电压和电流是两个基本的电气概念,对于理解和设计电子电路至关重要。它们直接影响到嵌入式系统的性能、功耗、可靠性和安全性。 电压(Voltage) 电压是电场力推动电荷移动的能力,通常以…...
RTC、直播、点播技术对比|腾讯云/即构/声网如何选型 — 2025 版
前言 作为一个有多年实战经验的开发者,在音视频技术领域我深刻体会到 RTC(实时通信)、直播和点播三者的不同。虽然它们的核心都涉及音视频内容的传输,但在实际应用中,它们的技术实现、使用场景以及所面临的挑战各不相…...
《白帽子讲 Web 安全》之文件操作安全
目录 引言 (一)文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传…...
ElevenLabs缅甸文语音准确率仅68.3%?实测对比5种预处理方案,第4种提升至92.7%(附Jupyter验证代码)
更多请点击: https://kaifayun.com 第一章:ElevenLabs缅甸文语音准确率实测基准与问题定位 为系统评估 ElevenLabs 对缅甸文(Burmese, my-MM)语音合成的准确性,我们在统一硬件环境(Intel i7-11800H 32GB …...
开源数字微流控平台OpenDrop:3步打造你的微型生物实验室
开源数字微流控平台OpenDrop:3步打造你的微型生物实验室 【免费下载链接】OpenDrop Open Source Digital Microfluidics Bio Lab 项目地址: https://gitcode.com/gh_mirrors/ope/OpenDrop 你是否曾梦想在桌面上建立一个完整的生物实验室?OpenDrop…...
JS 异步 从零讲(大白话 + 真实场景 + 可运行案例)
按顺序:回调函数 → Promise → async/await,工作最常用,直接上手。1. 回调函数(最原始,缺点:回调地狱)2. Promise(解决回调地狱,链式调用)new Promise((reso…...
ChromeKeePass终极指南:如何在Chrome浏览器中实现KeePass密码自动填充
ChromeKeePass终极指南:如何在Chrome浏览器中实现KeePass密码自动填充 【免费下载链接】ChromeKeePass Chrome extensions for automatically filling credentials from KeePass 项目地址: https://gitcode.com/gh_mirrors/ch/ChromeKeePass ChromeKeePass是…...
如何将Scrapeless MCP服务器集成到ZeroClaw中:逐步指南
关键要点: 一个TOML块将云浏览器连接到本地Rust代理。 ZeroClaw是一个单一二进制AI代理运行时,它与LLM提供者通信,监听30多个频道,并通过工具进行操作。只需在~/.zeroclaw/config.toml中添加四行[mcp]块即可添加Scrapeless MCP服…...
2026毕业季硕士论文AIGC检测率合格标准全汇总(20%还是15%)
2026年硕士论文答辩前,AIGC检测已经和查重一样成了必过流程。但各校对硕士论文AIGC检测率的合格标准并不统一——有的学校要求20%以下,有的15%以下,个别学校甚至要求10%以下。 你的学校硕士论文AIGC检测率多少算合格?超标了怎么快…...
配置Hermes Agent使用自定义Taotoken作为模型供应商的步骤
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 配置Hermes Agent使用自定义Taotoken作为模型供应商的步骤 1. 准备工作:获取必要的凭证 在开始配置之前,你…...
树莓派CM4刀片服务器设计:从电源管理到集群部署全解析
1. 项目概述:当树莓派计算模块遇上“刀片式”设计如果你和我一样,是个树莓派的老玩家,从最初的Model B一路玩到最新的5代,那你肯定对树莓派计算模块(Compute Module,简称CM)又爱又恨。爱的是它把…...
PentAGI:面向红队实战的开源渗透测试Agent系统
1. 这不是另一个“AI安全”的概念玩具,而是一套能真正进红队实战的渗透测试Agent系统你有没有遇到过这样的场景:在一次内部红队演练中,刚摸到一台边缘业务服务器,想快速判断它是否暴露了Jenkins未授权访问、Confluence远程代码执行…...
免费解锁WeMod完整功能:Wand-Enhancer终极指南
免费解锁WeMod完整功能:Wand-Enhancer终极指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod免费版的功能限制而烦恼吗&#x…...
