当前位置: 首页 > news >正文

分布式锁(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.lryc.cn/news/384765.html

相关文章:

  • linux内存排查工具smem使用
  • 云主机相比物理机有哪些优势
  • ClickHouse-Keeper安装使用
  • 全国产飞腾+FPGA架构,支持B码+12网口+多串电力通讯管理机解决方案
  • bat命令 批处理 脚本 windows DOS
  • 【云计算】阿里云、腾讯云、华为云RocketMQ、Kafka、RabbitMq消息队列对比
  • 【JavaScript脚本宇宙】玩转数据存储:深入剖析提升 Web 应用程序性能的六大利器
  • Web应用和Tomcat的集成鉴权2-Form Authentication
  • async、await 官宣:JavaScript 中的异步编程新纪元
  • 日元跌破160大关,日本当局何时干预?
  • iptables(12)实际应用举例:策略路由、iptables转发、TPROXY
  • phpMyAdmin 4.0.10 文件包含 -> getshell
  • Spring Boot中如何集成ElasticSearch进行全文搜索
  • HistoQC|病理切片的质量控制工具
  • C/C++ - 编码规范(USNA版)
  • leetcode刷MySQL记录——sum/count里加条件判断、avg求满足条件记录数占比
  • PHP的SHA256WithRSA签名和Curl POST请求函数
  • 5G RAN
  • Mybatis动态sql标签
  • Linux CentOS Suhosin禁用php5.6版本eval函数详细图文教程
  • 这5招底层逆袭玄学,一个人越来越厉害的秘诀
  • MySQL自学教程:1. MySQL简介与安装
  • Jenkins多stage共享同一变量方式
  • Ant design Vue 表格中显示不同的状态(多条件显示)
  • 如何借助物联网实现土壤监测与保护
  • Linux之prometheus安装和使用简介(一)
  • orcle数据表空间操作sql
  • 【Unity Android】Unity链接安卓手机调试
  • 数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?
  • vue3中通过vditor插件实现自定义上传图片、录入echarts、脑图、markdown语法的编辑器