java | 基于Redis的分布式锁实现①
前言
首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:
- 互斥性。在任意时刻,只有一个客户端能持有锁。
- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
- 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
- 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
实现
- 首先引入
jedis组件依赖,pom中添加如下配置:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>
- 加锁代码
private static final String LOCK_SUCCESS = "OK";/*** 该加锁方法仅针对单实例 Redis 可实现分布式加锁* 对于 Redis 集群则无法使用* 支持重复,线程安全** @param lockKey 加锁键* @param requestId 加锁客户端唯一标识* @param milliseconds 锁过期时间:此处使用的单位为 px-毫秒数,若需要单位为秒,则改用parms.ex(int seconds)* @return*/public Boolean tryLock(String lockKey, String requestId, long milliseconds) {SetParams parms = new SetParams();parms.px(milliseconds);return redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> {Jedis jedis = (Jedis) redisConnection.getNativeConnection();String result = jedis.set(lockKey, requestId, parms);return LOCK_SUCCESS.equals(result);});}
第一个参数:加锁的key,当前没有锁(key不存在),那么就进行加锁操作,已有锁存在,不做任何操作。
第二个参数:为确保安全性,需要key和value都一致才会解锁。
第二个参数:(看代码注释)
- 解锁代码
private static final Long RELEASE_SUCCESS = 1L;// if get(key) == value return del(key)private static final String RELEASE_LOCK_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";/*** 与 tryLock 相对应,用作释放锁** @param lockKey 加锁键* @param requestId 加锁客户端唯一标识* @return*/public Boolean releaseLock(String lockKey, String requestId) {return redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> {Jedis jedis = (Jedis) redisConnection.getNativeConnection();Object result = jedis.eval(RELEASE_LOCK_SCRIPT, Collections.singletonList(lockKey),Collections.singletonList(requestId));return RELEASE_SUCCESS.equals(result);});}
解锁的思路是使用eval()提交一个Lua脚本代码:首先获取锁对应的value值,检查是否与requestId相等,如果相等则删除锁(解锁)。
那为什么使用eval()?在eval命令执行Lua代码的时候,Lua代码将被当成一个命令去执行,直到eval命令执行完成,Redis才会执行其他命令。也就是说,这个操作满足原子性,保证了安全性。
相关文章:
java | 基于Redis的分布式锁实现①
前言 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户…...
十六、基于FPGA的CRC校验设计实现
1,CRC校验循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的…...
2022爱分析 · DataOps厂商全景报告 | 爱分析报告
报告编委 李喆 爱分析合伙人&首席分析师 廖耘加 爱分析分析师 目录 1. 研究范围定义 2. 市场洞察 3. 厂商全景地图 4. 市场分析与厂商评估 5. 入选厂商列表 1. 研究范围定义 研究范围 在后疫情时代,以数据分析为代表的数据消费场景日益丰富&…...
京东前端react面试题及答案
useEffect 与 useLayoutEffect 的区别 (1)共同点 运用效果: useEffect 与 useLayoutEffect 两者都是用于处理副作用,这些副作用包括改变 DOM、设置订阅、操作定时器等。在函数组件内部操作副作用是不被允许的,所以需…...
TongWeb8数据源相关问题
问题一:数据源连接不足当TongWeb数据源连接用完时,除了监控中看到连接占用高以外,日志中会有如下提示信息。2023-02-14 10:24:43 [WARN] - com.tongweb.web.jdbc.pool.PoolExhaustedException: [TW-0.0.0.0-8088-3] Timeout: Pool empty. Una…...
关于最近大热的AI,你怎么看?
AI人工智能,相信大家都不陌生,也都接触过不少。但是最近小编在网上冲浪的时候发现各大媒体又掀起了一阵AI热潮,AI不是很常见了吗?是又有什么新的发展吗? 带着强烈的好奇心,我在地铁上读完了一篇关于Chatgp…...
25.架构和软件产品线
文章目录25 Architecture and Software Product Lines架构和软件产品线25.1 An Example of Product Line Variability 产品线可变性的一个例子25.2 What Makes a Software Product Line Work? 软件产品线的工作原理是什么?25.3 Product Line Scope 产品线范围25.4 …...
Seata-server 源码学习(一)
Seata源码学习引入 学习了Seata的应用以后,我们从这开始要开始分析Seata的源码相关内容 源码下载 官方地址:https://seata.io/zh-cn/blog/download.html 通过idea打开seata-1.4.2版本的源码 回顾AT模式 其实在之前的应用课程中,我们已经用…...
2023新华为OD机试题 - 斗地主(JavaScript)
斗地主 题目 斗地主起源于湖北十堰房县, 据传是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的, 如今已风靡整个中国,并流行于互联网上 牌型: 单顺,又称顺子,最少5张牌,最多12张牌(3...A),不能有2, 也不能有大小王,不计花色 例如:3-4-5-7-8,7-8-9-1…...
素数相关(结合回文数,合数)线性筛素数(欧拉筛法)Euler【算法模板笔记】
一、朴素筛法(埃拉托斯特尼筛法)Eratosthenes 筛法(埃拉托斯特尼筛法,简称埃氏筛法)时间复杂度是O(nloglogn)不常用,被欧拉筛代替,略二、线性筛素数(欧拉筛法)简介线性筛…...
1.7配置OSPF手动汇总
实验7:配置OSPF手动汇总 实验目的实现OSPF路由汇总的配置阐明OSPF引入的外部路由时进行路由汇总的方法实验拓扑配置OSPF手动汇总实验拓扑如图1-17所示。 图1-17 配置OSPF手动汇总 实验步骤配置IP地址,配置OSPF(和实验6一致,此处略)在…...
多线程下载工具axel的安装和使用
多线程下载工具axel的安装和使用 Axel是一个轻量级下载程序,它和其他加速器一样,对同一个文件建立多个连接,每个连接下载单独的文件片段以更快地完成下载。 Axel 支持 HTTP、HTTPS、FTP 和 FTPS 协议。它也可以使用多个镜像站点下载单个文件…...
大数据专业职业前景如何
大数据专业毕业生未来的岗位选择空间比较大,有三大类岗位可选择分别是大数据开发岗位、大数据分析岗位和大数据运维岗位,在不同的行业和技术体系结构下这些岗位也包含很多细分的岗位。 大数据开发岗位分为平台研发岗位和行业场景开发岗位两大类…...
拉格朗日乘数法在原材料选择问题上的具体应用
问题需求: 输入待制作的材料:(材料长,材料数量) 分别为(5401,124)、(200,135)、(1350,45), 输入原材料长度最大值6500,最小值3500&…...
零信任-腾讯零信任iOA介绍(4)
腾讯零信任介绍 腾讯零信任是一种信息安全架构,旨在通过限制对计算设备、数据和应用程序的访问来保护敏感信息。腾讯零信任的主要思想是,任何计算设备、数据或应用程序都不应被自动信任,并需要经过授权后才能访问敏感信息。 腾讯零信任的…...
标准的maven依赖包应该包含哪些东西?
背景在阅读源码的时候,发现有一些maven依赖包里面没有包含pom文件,一些maven依赖包包含,而且除此之外还有一些细微的差异。今天就来聊一下关于一个标准的依赖包应该是什么样子的。一个标准的Maven依赖包通常包含以下文件:Java类文…...
网络安全-Nmap
网络安全-Nmap Nmap-号称诸神之眼 这个呢就是用来扫描网络端口的 Namp的工作原理很像一个雷达 做任何攻击之前,得先知道怎么去找破绽,而不是钢铁洪流,那个是不叫渗透了,叫硬钢。 咋用呢? 很简单 直接 nmap 后面跟网址…...
【物联网】mqtt初体验
文章目录安装EMQXjava集成添加依赖mqtt配置参数发布组件订阅组件测试接口接口测试最近在了解物联网云平台方面的知识,解除了mqtt协议,只看书籍难免有些枯燥,所以直接试验一下,便于巩固理论知识。 broker服务器操作系统:…...
2023年阿里云活动有哪些实例规格的云服务器?如何选择这些实例规格
2023年阿里云活动有哪些实例规格的云服务器?新手用户通过阿里云活动选购阿里云服务器的时候实例规格应该怎么选,因为同配置的云服务器往往有多种不同是规格的云服务器可供选择,而且不同实例规格的云服务器之间价格差别还比较大,因…...
深入理解 Handler(java 层 + native 层)
文章目录回顾线程消息队列时怎样实现的消息是怎么传递的?Handle 的延迟消息是怎么处理的?IdleHandler 的原理主线程进入了 Looper 循环为什么没有 ANR?消息屏障是什么?回顾 之前学习过Handler相关的基础知识,今天再学…...
用 Google Stitch 重构设计系统
大多数 AI 设计工具在你尝试将它们接入真实产品工作流之前都感觉像玩具,然后一切都崩塌了。Google Stitch 有趣的地方在于它试图将设计视为可编程的表面,而不仅仅是一个漂亮的画布。 1、Google Stitch 到底是什么 如果忽略营销宣传,Stitch …...
缺口大!平均月薪超2万元!这个岗位超级火!
当下最火的是什么?答案毫无悬念,一定是人工智能。如今,人工智能行业正以肉眼可见的速度迅速崛起,市场对相关专业人才的需求也随之越来越大。1.市场人才缺口大前几天,人民日报、央视财经等多个主流媒体发布文章…...
深圳龙岗企业周花哪个好
深圳龙岗企业周花哪个好?深圳皇家文化传媒有限公司值得关注在深圳龙岗,企业对于周花的需求日益增长,优质的企业周花不仅能够美化办公环境,还能提升企业形象。那么,深圳龙岗企业周花哪个好呢?深圳皇家文化传…...
ESP32/ESP8266嵌入式NVS数据库C++封装库
1. 项目概述NVSDatabase 是一个面向 ESP-IDF 生态的 C 封装库,其核心目标是为 ESP32 和 ESP8266 平台提供类型安全、接口清晰、工程友好的非易失性存储(Non-Volatile Storage, NVS)访问能力。该库并非对底层 NVS API 的简单 C 风格包装&#…...
2026江门LED柔性灯带模切线路板厂家权威推荐榜单来袭
在LED照明产业蓬勃发展的当下,LED柔性灯带模切线路板作为关键组件,其市场需求日益增长。江门作为重要的产业基地,拥有众多优秀的线路板厂家,盈声电子便是其中的佼佼者。盈声电子的技术实力盈声电子掌握着环保型无导线线路板&#…...
实战指南:如何用Mask R-CNN在iSAID数据集上提升航空影像分割效果(附调参技巧)
航空影像实例分割实战:Mask R-CNN在iSAID数据集上的调优策略 航空影像分析正逐渐成为城市规划、灾害监测和国防安全等领域的关键技术。与常规自然图像不同,这类影像通常包含大量密集分布的小目标,且目标尺度变化极大——从几个像素的小型车辆…...
VSG并联系统振荡了?从根轨迹和参与因子分析稳定性(实例详解)
VSG并联系统振荡问题诊断:从根轨迹到参与因子的工程实践指南 当三台VSG并联系统在实验室首次同步运行时,我们观察到了令人不安的2.4Hz持续功率振荡。这种低频振荡不仅导致功率分配失衡,更威胁着整个微电网的稳定运行。作为从业十二年的电力电…...
基于Ai Coding,20天完成一个基于大模型的医学分析系统:Ai体征分析助手
我是一名长期使用C#开发后台服务与数据库的开发者,在短短20天内,独立完成一个跨前后端、贴合医疗健康场景分析的完整系统(Ai体征分析助手)是未曾想过的。得益于AI Coding工具的深度实践与应用和医疗领域大模型的应用,让…...
从零开始:在VMware虚拟机上部署FreeNAS的完整指南
1. 为什么选择在VMware上部署FreeNAS? 如果你正在寻找一个经济实惠又灵活的NAS解决方案,在VMware虚拟机上跑FreeNAS绝对是个明智的选择。我最早接触这个方案是在帮朋友搭建家庭媒体中心时,当时用实体机装FreeNAS总觉得太浪费硬件资源…...
GTE文本向量模型快速上手:无需深度学习基础,一键部署多任务NLP分析工具
GTE文本向量模型快速上手:无需深度学习基础,一键部署多任务NLP分析工具 你是不是觉得自然语言处理(NLP)听起来很高深?是不是看到“文本向量”、“模型微调”这些词就头疼?别担心,今天我要带你体…...
