分布式锁(4):jedis基于Redis setnx、get、getset的分布式锁

1 实现原理

  1. setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向步骤(2)
  2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向步骤(3)
  3. 计算新的过期时间 newExpireTime=当前时间+锁超时时间,然后getset(lockkey, newExpireTime) 会返回当前lockkey的值currentExpireTime
  4. 判断 currentExpireTime 与 oldExpireTime 是否相等,如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。
  5. 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行del命令释放锁(释放锁之前需要判断持有锁的线程是不是当前线程);如果大于锁设置的超时时间,则不需要再锁进行处理。

2 代码实现

2.1 redis操作类

package com.example.demo.utils;

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

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

相关文章

《多线程》

每一个任务就是一个进程,每个进程内部至少有一个线程在运行中。线程是程序执行的一个路径,每一个线程都有自己的局部变量表,程序技术器,以及各自的生命周期。 1.创建一个线程,并且重写它的run方法,将行为方…

swift使用swift-protobuf协议通讯,使用指北

什么是Protobuf Protobuf(Protocol Buffers)协议😉 Protobuf 是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。 为什么要使用Proto…

UnrealEngine打开Setup.bat,提示Failed to download的解决方法

Failed to download when I run Setup.bat - #3 by Milisours - Getting Started & Setup - Epic Developer Community Forums https://forums.unrealengine.com/uploads/short-url/oGTskBcZI8ACTyCw7jIK2dTmkC7.xml 下载这个文件 然后替换掉Engine/Build/下面的Commit.g…

c++ map set底层模拟实现

关于这两个数据结构的insert接口实现 请看这篇文章 https://blog.csdn.net/l23456789mmmmm/article/details/139500413?spm1001.2014.3001.5501 map::operator[]底层实现请看这篇文章 cmap类operator[]详解_c map operator-CSDN博客 红黑树模拟实现 #pragma once #include &…

Java面试八股之myBatis与myBatis plus的对比

myBatis与myBatis plus的对比 基础与增强: MyBatis 是一个成熟的Java持久层框架,它允许开发者通过XML文件或注解来配置SQL语句和数据库映射,提供了一个灵活的方式来操作数据库,但需要手动编写所有的SQL语句和结果集映射。 MyBa…

Day55 代码随想录打卡|二叉树篇---二叉搜索树中的插入操作

题目(leecode T701): 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch 简介基本概念ElasticSearch概念-倒排索引安装基本命令ik 分词器SpringBoot整合测试存储数据:测试复杂检索同步与异步调用 参考 简介 Elasticsearch 是一…

【AIGC】MetaGPT原理以及应用

目录 MetaGPT原理 MetaGPT应用 MetaGPT和传统编程语言相比有什么优势和劣势 视频中的PPT 参考资料 MetaGPT原理 MetaGPT是一种多智能体框架,它结合了元编程技术,通过标准化操作程序(SOPs)来协调基于大语言模型的多智能体系统…

Zookeeper 集群节点选举原理实现(三)

Zookeeper 集群节点选举原理实现(三) 刚部署三个节点或者多个节点启动时,此时还未选择出领导节点,不同节点的初始化zxid 是如何保证不重复不冲突有序呢? 在 Zookeeper 集群的初始启动阶段,所有节点会在选举领导节点之前先初始化自己的状态和 ZXID。为了确保不同节点的初始…

jieba中文分词器的使用

Jieba 是一个中文分词的第三方库,主要用于对中文文本进行分词。分词是将文本分割成一个个词语的过程,这在中文文本处理中尤为重要,因为中文不像英文那样有明显的空格来分隔词语。Jieba 的分词算法可以实现精确分词、全模式分词和搜索引擎模式…

嵌入式实验---实验一 通用GPIO实验

一、实验目的 1、掌握STM32F103 GPIO程序设计流程; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、通过按键实现:按键按下,LED点亮;按键释放,LED熄灭。 三、实验设备和器材 电脑、Keil uVision5软件、Proteus…

Hierarchical Integration Diffusion Model for Realistic Image Deblurring

neurips23 上交&ETH&字节&清华&上海ai lab&悉尼大学&西湖大学https://github.com/zhengchen1999/HI-Diff 问题引入 现在的diffusion的方法在sample的时候需要的iteration过多,所以本文提出在高度压缩的空间进行DM,且deblur模型…

力扣第209题“长度最小的子数组”

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中,我们将详细解读力扣第209题“长度最小的子数组”。通过学习本篇文章,读者将掌握如何使用滑动窗口和双指针的方法来解决这一问题&#xff0…

甲辰年五月十四风雨思

甲辰年五月十四风雨思 夜雨消暑气,远光归家心。 ​只待万窗明,朝夕千家勤。 ​苦乐言行得,酸甜日常品。 宫商角徵羽,​仁义礼智信。

【python】PyCharm如何设置字体大小和背景

目录 效果展示 字体大小 背景设置 效果展示 字体大小 再左上角找到四条杠的图标 找到File 一般字体大小为22最合适,行间距为默认 背景设置 还是再字体设置的页面搜索 background 小编的其他文章详见,欢迎来支持 东洛的克莱斯韦克-CSDN博客 【机器…

如何优雅的一键下载OpenHarmony活跃分支代码?请关注【itopen: ohos_download】

itopen组织:1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、概述 为方便大家每次下载OpenHarmony不同分支/tag代码&#xff0c…

【文末附gpt升级秘笈】“登月游戏”对人类的意义

“登月游戏”对人类的意义是多方面的,不仅体现在科技、教育和娱乐层面,还对人类探索未知的精神产生了深远影响。 一、科技意义 “登月游戏”作为早期计算机游戏的代表之一,展示了计算机技术在模拟现实世界方面的能力。通过模拟登月器的着陆…

数据库-单表查询-排序和分组

对查询结果排序: SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]]; ASC 升序关键字DESC 降序关键字 分组查询的单独使用: SELECT 字段名 FROM 表名 GROUP BY 字段名; 使用 LIMIT 限制查询结果的数量: SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数; 第一个…

程序员失业了,你可以做这些事情

这篇文章,我们讲,你先别带入自己哈,如果失业了,放心吧,你那么有上进心,不会失业的。咱就是说,如果万一失业了,你可以做这些事情。 1 体力好的铁人三项 👩‍&#x1f3e…