Redis分布式锁【简单版】
文章目录
- 概要
- 例子1【SETNX + EXPIRE】
- 例子2【 Redisson 】
概要
redis分布式锁六种方案
-
SETNX + EXPIRE 方案:
- 描述:使用Redis的SETNX命令来尝试设置一个键值对,如果该键不存在,则设置成功并设置过期时间,实现锁的功能。
-
SETNX + value值 方案:
- 描述:通过SETNX命令尝试设置键值对,并将值设置为当前系统时间加上锁的过期时间,锁的释放可以通过比较值来判断是否过期。
-
Lua脚本 方案:
- 描述:使用Lua脚本结合SETNX和EXPIRE两条指令,通过保证原子性来实现分布式锁。
-
SET的扩展命令(SET EX PX NX)方案:
- 描述:利用Redis的SET命令的扩展参数,结合EX、PX和NX参数,可以一步完成锁的设置。
-
开源框架 Redisson 方案:
- 描述:Redisson是一个基于Redis的Java框架,提供了分布式锁等多种分布式功能的实现,简化了开发者的工作。
-
多机实现的分布式锁 Redlock 方案:
- 描述:Redlock通过在多个Redis节点上获取锁,并使用时钟同步算法确保锁的可靠性和一致性。
例子1【SETNX + EXPIRE】
public class Test {private static final String LOCK_KEY = "my_lock";public static void main(String[] args) {// 连接到Redis服务器Jedis jedis = new Jedis("122.51.159.21", 6379);// 获取锁if (acquireLock(jedis, LOCK_KEY)) {try {// 执行需要加锁的业务逻辑System.out.println("锁已获取。正在执行关键部分...");// 模拟业务处理时间Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 保证释放锁releaseLock(jedis, LOCK_KEY);}} else {System.out.println("无法获取锁。另一个进程持有该锁。");}// 关闭连接jedis.close();}private static boolean acquireLock(Jedis jedis, String lockKey) {// 尝试设置锁,如果成功返回1,否则返回0Long result = jedis.setnx(lockKey, "locked");if (result == 1) {// 设置锁的过期时间jedis.expire(lockKey, 30);// 过期时间 30sreturn true;}return false;}private static void releaseLock(Jedis jedis, String lockKey) {// 释放锁jedis.del(lockKey);}
}
此方案缺点:
- 在高并发情况下,多个客户端可能同时执行 SETNX 命令并都成功获取锁,导致竞争条件发生
- 加锁与与设置过期时间是非原子操作
- 如果业务逻辑执行时间超过了过期时间,锁可能会在业务逻辑执行完之前被自动释放
例子2【 Redisson 】
public class Test {public static void main(String[] args) {// 创建 Redisson 客户端连接Config config = new Config();config.useSingleServer().setAddress("redis://122.51.159.21:6379");RedissonClient redisson = Redisson.create(config);// 获取分布式锁RLock lock = redisson.getLock("my_lock");try {// 尝试加锁,最多等待 10 秒,锁的持有时间为 20 秒boolean isLocked = lock.tryLock(10, 20, java.util.concurrent.TimeUnit.SECONDS);if (isLocked) {// 成功获取到锁System.out.println("成功获取到锁,执行业务逻辑...");// 在这里执行你的业务逻辑} else {// 获取锁失败System.out.println("获取锁超时,未能执行业务逻辑...");}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 释放锁lock.unlock();}// 关闭 Redisson 客户端连接redisson.shutdown();}
}
Redisson解决了:锁过期释放,业务没执行完。
Redisson中watch dog看门狗可以去了解下。
❤觉得有用的可以留个关注❤
相关文章:
Redis分布式锁【简单版】
文章目录 概要例子1【SETNX EXPIRE】例子2【 Redisson 】 概要 redis分布式锁六种方案 SETNX EXPIRE 方案: 描述:使用Redis的SETNX命令来尝试设置一个键值对,如果该键不存在,则设置成功并设置过期时间,实现锁的功能…...
18.Blender 渲染工程、打光方法及HDR贴图导入
HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角,点击箭头,展开详细部分 点击材质球,会出现下面一列材质球,将鼠标拖到第二个材质球,会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…...
VBA在Excel中部首组查字法的应用
VBA在Excel中部首组查字法的应用 文章目录 前言一、网站截图二、操作思路三、代码1.创建数据发送及返回方法2.创建截取字符串中的数值的方法3.获取部首对应的编码4.获取特定部首的汉字运行效果截图前言 使用汉语字典查生字、生词,多用拼音查字法和部首查字法。以前都是用纸质…...
ASP.NET MVC 4升级迁移到ASP.NET MVC 5
背景:今天针对一个老项目进行框架升级,老项目使用的是MVC 4,现在要升级到MVC5。 备份项目.NET升级4.5以上版本通过Nuget,更新或者直接安装包 包名oldVersionnewVersion说明Microsoft.AspNet.Mvc4.0.05.x.xMicrosoft.AspNet.Razo…...
AIGC时代已至,你准备好抓住机遇了吗?
一、行业前景 AIGC,即人工智能生成内容,是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步,AIGC已经取得了显著的成果,并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…...
2024CCPC郑州邀请赛暨河南省赛
比赛记录:看群里大家嘎嘎拿牌,自己个人来solo了一下,发现简单到中等题很多,写了两小时出了7题,但是写的比较慢,对难题把握还是不准确 补题 : A题确实巧妙充分利用题目的数据范围来思考问题&…...
Spring 各版本发布时间与区别
版本版本特性Spring Framework 1.01. 所有代码都在一个项目中 2. 支持核心功能IoC、AOP 3. 内置支持Hibernate、iBatis等第三方框架 4. 对第三方技术简单封装。如:JDBC、Mail、事务等 5. 只支持XML配置方式。6.主要通过 XML 配置文件来管理对象和依赖关系࿰…...
前端模块导入导出方式
不同的导出方式和相应的导入方式,可以提炼成 3 种类型:name、default 和 list。 以下是使用示例: // Name Export | Name Import // 一个“命名”的导出 export const name value import { name } from ...❌ 错误示例: export…...
docker01-简介和概述
什么是docker? 我们现在开发项目是在windows操作系统使用idea开发,本地windows操作系统上有我们项目所需的jdk,mysql,redis,tomcat等环境,如果我们想打包我们的项目到一个别的服务器上,在别的服…...
java数据结构与算法(对称二叉树)
前言 为什么学习数据结构和算法? 1.直面大厂的高薪。 2.学习编程的语言。 3.输出优雅的代码和高性能的程序。 每日练习2题,希望大家都能收获高薪offer,实现自由跳槽。 实现原理 主要判断二叉树的以中间线为轴,两边的对称的…...
[原创](Modern C++)现代C++的std::function, 强大的多态函数包装器(包含std::mem_fn使用方式).
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...
解决间歇性 SSLPeerUnverifiedException 问题
问题背景 您在使用 SonarQube 与 GitHub Enterprise 进行拉取请求装饰时,遇到了间歇性的 javax.net.ssl.SSLPeerUnverifiedException 异常。具体错误信息如下: txt javax.net.ssl.SSLPeerUnverifiedException: Hostname XXXXXXX not verified (no certificates)at okhttp3…...
Linux程序开发(一):Linux基础入门安装和实操手册
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…...
Java | Leetcode Java题解之第92题反转链表II
题目: 题解: class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode dummyNode new ListNode(-1);dummyNode.next head;ListNode pre dummyNode;for (int i 0; …...
声纹识别在无人机探测上的应用
无人机在民用和军事领域的应用越来越广泛。然而,随着无人机数量的增加,"黑飞"现象也日益严重,对公共安全和隐私构成了威胁。因此,开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…...
【数据结构】时间、空间复杂度实例分析
跌倒了,就重新站起来,继续向前走;傻坐在地上是没用的。💓💓💓 目录 •✨说在前面 🍋知识点一:算法的效率 • 🌰1.斐波那契数列的第n项 • 🌰2.算法的复杂度…...
2024生日快乐祝福HTML源码
源码介绍 2024生日快乐祝福HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 2024生日快乐祝福HTML源码...
Android系统不同版本存储权限
一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储(读写)权限,除了在AndroidManifest.xml文件里声明,app运行时也要动态申请使用对应的权限 提醒:应用私有存储不需要动态申请权…...
ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处
1.需求分析: 就敌人ai而言,追踪到敌人有可能丢失目标,丢失目标后应该能返回原来位置,实现这一功能。 2.操作实现: 1.思路:利用clear value函数,禁用掉当前的追踪功能,执行之后的返…...
Linux quotacheck命令教程:如何检查和修复文件系统的磁盘配额(附案例详解和注意事项)
Linux quotacheck命令介绍 quotacheck命令是用于扫描文件系统以检查磁盘配额的一致性。它生成、检查和修复配额文件。这个命令通常在系统引导时运行,或者在手动更改了配额设置后运行。 Linux quotacheck命令适用的Linux版本 quotacheck命令在大多数Linux发行版中…...
Kimsuky 组织基于 PebbleDash 与 AppleSeed 的攻击战术演进与技术分析
摘要 Kimsuky(亦称 APT43、Ruby Sleet 等)是活跃逾十年的朝鲜语系高级持续性威胁(APT)组织,长期针对韩国及全球多国政府、国防、医疗等关键领域实施定向攻击。本文基于卡巴斯基 GReAT 团队 2026 年 5 月公开的最新攻击…...
避坑指南:Halcon在C# WinForm中图像处理的内存管理与窗口显示问题
Halcon与C#联合开发中的内存管理与窗口显示避坑指南 引言 在工业视觉应用开发中,Halcon与C#的联合开发模式因其高效性和灵活性而广受欢迎。然而,许多开发者在实际项目中常会遇到一些棘手的"坑",尤其是内存管理和窗口显示方面的问题…...
NotebookLM生物技术研究落地难?92%实验室尚未启用的3个隐藏功能(内部白皮书首次公开)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM生物技术研究落地难?92%实验室尚未启用的3个隐藏功能(内部白皮书首次公开) NotebookLM 作为 Google 推出的实验性 AI 助手,其在生物技术领域的…...
语义分割模型库选型指南:除了segmentation_models_pytorch,还有哪些宝藏库?附113个编码器实战对比
语义分割模型库深度选型指南:从SMP到工业级解决方案全景解析 当面对一个全新的语义分割项目时,工程师们往往会在众多开源模型库前陷入选择困难。本文将带您深入剖析主流语义分割工具库的技术特性、适用场景与实战表现,帮助您做出精准的技术决…...
钉钉机器人消息解析器:基于JSON Path与模板的自动化数据提取方案
1. 项目概述:一个钉钉消息解析器的诞生最近在做一个内部自动化工具时,遇到了一个挺有意思的需求:需要把钉钉机器人推送过来的消息,从原始的、结构复杂的JSON格式里,精准地“抠”出我们关心的业务数据。比如,…...
制造业生产能耗智能管控,落地步骤与落地成本优化方案:基于AI Agent与TARS大模型的全链路实战指引
在2026年的工业数字化浪潮中,制造业正面临前所未有的能源双控压力。随着工信部办公厅发布《关于组织开展2026年度工业节能监察工作的通知》,针对新能源产业链及重点耗能环节的监管已进入“精细化、实时化、透明化”的新阶段。对于企业而言,能…...
KAN神经网络在GPT架构中的可解释性实验与实现
1. 项目概述:当KAN神经网络遇上GPT,一场关于可解释性的实验最近在开源社区里,一个名为“kan-gpt”的项目引起了我的注意。这个项目将两个看似不相关的领域——KAN(Kolmogorov–Arnold Networks)神经网络和GPTÿ…...
高清视频与多传感器数据采集主板选型与开发实战指南
1. 项目概述与核心价值最近几年,高清视频和数据采集的需求可以说是遍地开花。从工业质检的产线监控,到智慧城市的交通流量分析,再到科研领域的实验过程记录,大家不再满足于“看得见”,而是追求“看得清、看得全、看得懂…...
学Simulink——光伏储能系统双向DC-AC逆变器恒功率控制(PQ控制)仿真
目录 手把手教你学Simulink——光伏储能系统双向DC-AC逆变器恒功率控制(PQ控制)仿真 一、背景与挑战 1.1 为什么 PQ 控制?光伏与储能的“任务本质” 1.2 核心痛点与设计目标 二、系统架构与核心控制推导 2.1 整体架构:功率指令 → 电流跟踪 → 电网注入 2.2 核心数学…...
CANape实战:如何绕过CSMconfig识别问题,用VN5610A的Network模式连接ECAT ADMM模块
CANape高阶实战:绕过CSMconfig限制实现VN5610A与ECAT模块的Network模式直连 当工程师面对CSMconfig无法识别VN5610A网口的报错窗口时,往往会陷入传统配置路径的思维定式。这个看似简单的识别问题背后,实际上隐藏着新旧硬件架构更迭带来的工作…...
