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

Redisson 分布式锁(基于v1.3.1)

Redisson 分布式锁

v1.0.0版本问题

v1.0.0版本的实现在持有锁的JVM或者持有锁的线程挂掉没有释放锁时,该锁不会被释放并且会一直占用,这个时候就使用DEL命令手动删除。

问题解决

v1.3.1版本通过key的ttl解决了这个问题,关键加锁逻辑改为了Lua脚本

加锁

,关键逻辑:

  1. 根据key名称获取key的value数据
  2. 如果value信息返回false,则代表key不存在,调用redis.call设置key和value并且设置key的超时时间为用户设置的时间或默认超时时间,默认超时时间为30秒。
  3. 如果value存在则json解码获取o字段(o字段表示锁的owner),如果持有锁的JVM或线程是当前线程则将c(c字段为JVM或线程持有锁/获等待锁的计数)加1
  4. 最后返回当前Key的TTL
local v = redis.call('get', KEYS[1]); 
if (v == false) then redis.call('set', KEYS[1], cjson.encode({['o'] = ARGV[1], ['c'] = 1}), 'px', ARGV[2]); return nil; 
else local o = cjson.decode(v); if (o['o'] == ARGV[1]) then o['c'] = o['c'] + 1; redis.call('set', KEYS[1], cjson.encode(o), 'px', ARGV[2]); return nil; " +end;return redis.call('pttl', KEYS[1]); 
end

解锁

  1. 先检查锁Key是否存在,不存在返回OK,同时发布消息(问题:它想解锁而此时锁却不存在了,这是不是有可能已经出事了)
  2. 锁KEY还存在就检查一下owner是不是自己,如果是自己就将计数减1,如果计数还不为0就为锁续期;如果计数为0就删除锁KEY同时发布事件。
local v = redis.call('get', KEYS[1]); 
if (v == false) then redis.call('publish', ARGV[4], ARGV[2]);  return 'OK';  
else  local o = cjson.decode(v);  if (o['o'] == ARGV[1]) then  o['c'] = o['c'] - 1;  if (o['c'] > 0) then  redis.call('set', KEYS[1], cjson.encode(o), 'px', ARGV[3]);return 'FALSE';else  redis.call('del', KEYS[1]); redis.call('publish', ARGV[4], ARGV[2]);  return 'OK';end end; return nil;  
end

Lua脚本返回’OK’,'FALSE’和nil的区别:

  • OK: 表示成功解锁已经被成功解锁,因为锁不存在或已经删除?
  • FALSE: 此次解锁成功, 但是锁并没有被删除,因为unlock的次数还不够?
  • nil: 当前线程并没有持有该锁,你为什要解锁?给你个异常让你尝尝!

问题

  1. 高负载下锁无法续期该怎么办?
  • 不管它,由它去
  • 系统容量预估,不要让你的系统中的组件有那么大的压力
  • 突发情况下,万一某些业务或请求真的出问题了及时告警,业务部门该买单的就买单吧

相关文章:

Redisson 分布式锁(基于v1.3.1)

Redisson 分布式锁 v1.0.0版本问题 v1.0.0版本的实现在持有锁的JVM或者持有锁的线程挂掉没有释放锁时,该锁不会被释放并且会一直占用,这个时候就使用DEL命令手动删除。 问题解决 v1.3.1版本通过key的ttl解决了这个问题,关键加锁逻辑改为了…...

go并发之美·多个channel合并/多个数据流合并

多个数据流(来自于不同channel)合并为一个流。 一般用于多个相同性质来源的数据进行合并为一处进行统一处理。 目录 背景 实现赖着不走 变个花样:学成出师 背景 最近在重温武侠剧,无意间想到了一些情形然后手痒,想…...

数据库多租户实现三种方式

1960年,许多公司需要使用更多的运算资源,向持有Mainframe的供应商租用运算资源。与此同时,Mainframe的供应商会根据用户登录系统时输入的数据匹配ID,利用ID来计算运算的资源使用量,包含CPU,存储器&#xff…...

单协议 2.4GHz CC2651R31T0RGZR/CC2651R31T0RKPR无线MCU 802.15.4,蓝牙5.2

CC2651R31T0RGZR描述:具有 352KB 闪存的 SimpleLink 32 位 Arm Cortex-M4 单协议 2.4GHz 无线 MCU 48-VQFN -40C ~ 105C48QFN(明佳达电子)【介绍】CC2651R3器件是一款单协议 2.4 GHz 无线微控制器 (MCU),支持以下协议:…...

【项目精选】基于struts+hibernate的采购管理系统

点击下载 javaEE采购管理系统 本系统是一个独立的系统,用来解决企业采购信息的管理问题。采用JSP技术构建了一个有效而且实用的企业采购信息管理平台,目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析,采购系统需实现以下功能…...

在找docker命令和部署?看这一篇文章就够了。

一、docker 常用命令 docker ps -a #查看所有容器 docker images #查看所有images docker search rabbitmq #搜索rabbitmq docker pull rabbitmq #拉去rabbitmq docker run -id --namemy_rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq # 创建一个容器并启动 docker exec -it…...

NTLM协议原理分析

LM Hash 和 NTLM Hashwindows用户的密码以哈希的形式保存在SAM文件中“%SystemRoot%\system32\config\SAM”。域用户的密码以哈希的形式保存在域控的 NTDS.dit 文件中。 密码的哈希值格式如下用域名:uid:LM哈希:NTLM哈希:::由于LM Hash 有安全缺陷,所以Windows Vist…...

SOC计算方法:电流积分+开路电压

最近小猿在学习soc的计算方法,soc的估算方法大致有五种:电流积分法、开路电压法、阻抗法、智能估算法、状态观测器。今天先给大家介绍前两种方法。 什么是SOC 电池的状态(State of Charge,SOC)是电池能够提供的电荷总…...

linux mysql启动报错处理方案

启动命令: systemctl start mysqld 一、关闭selinux setenforce 0 二、...

Qt配置VS的编译环境(以MSVC2015 64bit为例)

目录 一、原因 二、VS2015安装 三、配置套件(Kits) 一、原因 很多时候,由于VS版本切换,需要从高版本切换到低版本,或者从低版本升级到高版本,例如VS2019到VS2015,或者VS2010到VS2015。 以VS2…...

iOS 9.3.5越狱环境安装配置

前言 家里有几个iOS设备,iTouch,iPad,都老旧了,正好弄来搭建开发环境。 目标:在iOS越狱环境上搭建基本的软件,将它变成小型Unix服务器和一个能开发iOS应用的环境。 什么是iOS越狱(iOS Jailbre…...

mac电脑解决Error: command failed: npm install --loglevel error --legacy-peer-deps

使用vue create xxx创建vue3项目的时候报错。 解决步骤: 1.sudo npm cache clean --force 2.再次创建就可以成功 补充:网上搜到很多方法,都尝试失败,因为遇到需要打开.vuerc,.npmrc的情况,记录一下怎样找到文件 1. 尝…...

Java中对象的finalization机制

本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。1、finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义…...

proteus光敏电阻电路的arduino仿真

虽然Fritzing0.9.10有了仿真的功能,但都是测试板,能够仿真的很有限,所以还是要借助proteus来仿真。这里,我们来实先一个简单的光明电阻的仿真电路。本篇博文,重点演示proteus仿真arduino光敏电阻,arduino采…...

MySql面试精选—慢查询如何优化

目录 1、如何界定是慢查询SQL 2、如何快速定位低效率SQL 1)查看慢SQL语句...

一款OutLook信息收集工具

OutLook 这是一款burp插件,用于Outlook用户信息收集,在已登录Outlook账号后,可以使用该 插件自动爬取所有联系人的信息 安装 在burp扩展面板加载jar即可 功能介绍 All Users 加载插件后,进入Outlook联系人面板,…...

java多线程(二一)并发协作生产者消费者设计模式

1.两个线程一个生产者一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个。 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加…...

Win YAPI + Jenkins 实现接口自动化测试

自动化测试 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。 为了解决这个问题,使用YAPI接口自动化测试功能,只需要配置每个接口的入参和对 RE…...

【计算机视觉 自然语言处理】什么是多模态?

文章目录一、多模态的定义二、多模态的任务2.1 VQA(Visual Question Answering)视觉问答2.2 Image Caption 图像字幕2.3 Referring Expression Comprehension 指代表达2.4 Visual Dialogue 视觉对话2.5 VCR (Visual Commonsense Reasoning) 视觉常识推理…...

2023百度面试真题

【百度】面试真题: 1、SpingBoot 也有定时任务?是什么注解? 在 SpringBoot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的Scheduled 注解,另一个则是使用第三方框架 Quartz。 使用 Spring 中的 Sch…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...