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

Redis锁的租约问题

目录

    • Redis的租约问题
    • Redis租约问题的想法
    • Redis租约问题的解决方案

Redis的租约问题

首先我们先来说一说什么是Redis的租约问题。
  在我们实现Redis分布式锁的时候,我们会出现Redis锁的时间<业务执行执行时间,这其实就是一个典型的租约问题,那么什么是租约问题呢?我们让用户线程获取锁之后,同时为了防止用户进程产生错误而无法释放锁,导致其他用户再也无法获取不到锁产生的死锁现象,所以我们为每一个锁设定一个Expire Time,这样即使在用户进程不能正常释放锁的情况下,过期时间到了之后,Redis会自动释放掉锁来让别的用户来获取到锁。
  这就是典型的租约机制,用户申请了一个租约时长为lock_timeout的锁,用户可以在租约期间使用完之后正常释放锁,如果说了租约时间,即使用户没有释放锁,Redis也会自动释放锁。
 
 

Redis租约问题的想法

  我们来设想一下,如果用户可以很清晰的知道自己将要使用锁的时间,那么我们设置lock_timeout就很容易了,但是如果当用户并不知道自己用锁的时间,设置租约就会是一个困难,当然,一般都不知道。我们设置租约时间

  • 如果我们设置的时间过短,那么可以用户还没用完锁,锁就被Redis释放掉了,之后多个用户访问一个共享资源产生错误。
  • 如果我们设置的时间过长,那么当用户如果产生错误不能正常释放锁的时候,其他用户线程就需要等待较长的时间才能获取到锁。

所以,我们就萌生出一个想法:当用户并不知道自己会用多久的时间,那么我们为该锁设置一个较小的lock_timeout,同时在该锁的过期之前,就自动的向服务器延长该锁的lifetime.
 
 

Redis租约问题的解决方案

Redis租约问题一般有两个解决方案。

  1. 业务调研
    我们需要大量测试我们业务的执行时间,然后可以将我们所的过期时间设置为业务时间的1.5倍,给他充分的冗余时间。但是如果我们考虑更多的异常情况发生的话,那么我们这种方法可能不太靠谱。所以就有了第二种方法。
  2. 锁的续约
    锁的续约,我们在去加锁的时候,一般都会去启动一个线程,而在开启这个启动线程的时候,我们同样去启动一个守护线程,这个守护线程,我们就可以用来作为锁的续命。过程:
    假设我们用户拿到了我们的锁,但是我们的业务时间远远大于我们加锁的时间,如果我们的锁快到我们的过期时间的时候,比如过期时间的前5s,这个时候我们就可以用我们的守护线程去扫它,看看我们的业务有没有执行完,如果没有执行完,那么续约同样的lock_timeout,以此类推,确保我们当前的加锁时间大于我们的业务执行时间,这个是锁续约的核心思想。

那么我们这么做可能会出现什么问题?
在我们进行业务调研后,我们得出了我们业务时间的平均值,如果我们的用户线程在执行过程中出现了问题,那么业务执行时间就会无限长,那么我们的岂不是会进行无限的续约?所以简单的设计有点不太合理。

那么怎么解决呢?
我们的解决方案是使用重试次数(这个重试次数是重点)
假设我们的业务的执行时间平均是10s,那么我们最多容忍它执行50s如果他还没有执行完成,那么我们就认为的服务器或者代码有问题,我们需要进行人为干预。这里的话,我们需要重试四次即可。

 

请添加图片描述
 

注意:我们的守护线程是依赖于我们的用户线程而生的,用户线程死,我们的守护线程就死,所以我们守护线程来进行续命,用户线程在,守护线程就在,就可以续命。
 请添加图片描述
 
请添加图片描述
 
这里使用了Lua脚本,Lua脚本的作用在于保证原子性,它能确保Lua脚本里面的内容要么同时执行,要么同时不执行。
 
请添加图片描述

 
 
 
  
  
  

相关文章:

Redis锁的租约问题

目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。   在我们实现Redis分布式锁的时候&#xff0c;我们会出现Redis锁的时间<业务执行执行时间&#xff0c;这其实就是一个典型的租约问题&#xf…...

2023年全国最新高校辅导员精选真题及答案50

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 94.一般认为&#xff0c;在具有了道德认知和道德情感的情况下&#xff0c;道德行为的产生…...

mall商城之k8s部署-4

文章目录 一、k8s部署应用服务1)master拷贝yaml2)批量修改镜像地址3)批量修改nacos地址3)创建命名空间4)创建取sercet5)配置yaml6)对象存储oss7)查看nacos1、导入配置文件2、修改配置文件8)部署到ms命名空间一、k8s部署应用服务 1)master拷贝yaml #将源码文件 mkdi…...

使用Go语言打造轻量级Web框架

前言 Web框架是Web开发中不可或缺的组件。它们的主要目标是抽象出HTTP请求和响应的细节&#xff0c;使开发人员可以更专注于业务逻辑的实现。在本篇文章中&#xff0c;我们将使用Go语言实现一个简单的Web框架&#xff0c;类似于Gin框架。 功能 我们的Web框架需要实现以下功能…...

【开源项目】BallCat 项目脚手架

简介 &#x1f389;&#x1f389;&#x1f389; 基于 React 和 Ant Design 版本的前端 ballcat-ui-react 已发布&#xff0c;欢迎大家尝鲜使用 BallCat 组织旨在为项目快速开发提供一系列的基础能力&#xff0c;方便使用者根据项目需求快速进行功能拓展。 在以前使用其他后台管…...

KlayGE-004-InputCaps 例子分析

InputCaps处理外部输入的事件 该例子主要由两部分内容&#xff1a; 外部输入事件获取 ​ 可以处理keyboard、mouse、joystick、touch、sensor的输入事件 显示一个ui图标按钮 Input 定义监听事件类型&#xff1a; KlayGE::InputActionDefine actions[] {InputActionDefin…...

组装机经验、软硬件故障排除、网络问题

目录 主板 CPU 内存 显卡 判断显卡好坏的步骤 新买的显卡安装后显示器不亮 电源 其他 网络问题 主板 1.不同主板对于不同数量的内存条安装的位置有要求&#xff0c;要按照主板规定的位置安装不同数量的内存条&#xff0c;特别是服务器主板&#xff0c;否则系统可能起…...

【行为型模式】责任链模式

文章目录1、简介2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现4、责任链优缺点5、应用场景1、简介 责任链模式(Chain of Responsibility)是一种行为型设计模式&#xff0c;它允许对象在链上依次处理请求&#xff0c;用户只需要将请求发送到责任链上即可&#xf…...

C++命令模式 指挥家:掌控命令模式之美

C指挥家&#xff1a;掌控命令模式之美 (C Conductor: Master the Beauty of Command Pattern一、引言 (Introduction)1.1 命令模式概述 (Overview of Command Pattern)1.2 命令模式的应用场景 (Application Scenarios of Command Pattern)二、命令模式的基本概念 (Basic Concep…...

学会 制作极简搜索浏览器 —— 并将 ChatGPT 接入浏览器

前期回顾 Vue3 Ts Vite pnpm 项目中集成 —— eslint 、prettier、stylelint、husky、commitizen_0.活在风浪里的博客-CSDN博客搭建VIte Ts Vue3项目并集成eslint 、prettier、stylelint、huskyhttps://blog.csdn.net/m0_57904695/article/details/129950163?spm1001.2…...

NumPy 秘籍中文第二版:六、特殊数组和通用函数

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; 创建通用函数查找勾股三元组用chararray执行字符串操作创建一个遮罩数组忽略负值和极值使用recarray函数创建一…...

各种交叉编译工具链的区别

目录 1 命名规则 2 实例 2.1 arm-none-eabi-gcc 2.2 arm-none-linux-gnueabi-gcc 2.3 arm-eabi-gcc 2.4 armcc 2.5 arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc 3 gnueabi和gnueabihf的区别(硬浮点、软浮点) 4 Linaro公司出品的交叉编译工具链 5 ARM公司出…...

密度聚类算法(DBSCAN)实验案例

密度聚类算法&#xff08;DBSCAN&#xff09;实验案例 描述 DBSCAN是一种强大的基于密度的聚类算法&#xff0c;从直观效果上看&#xff0c;DBSCAN算法可以找到样本点的全部密集区域&#xff0c;并把这些密集区域当做一个一个的聚类簇。DBSCAN的一个巨大优势是可以对任意形状…...

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解…...

异常的讲解(2)

目录 throws异常处理 基本介绍 throws异常处理注意事项和使用细节 自定义异常 基本概念 自定义异常的步骤 throw 和throws的区别 本章作业 第一题 第二题 第三题 第四题 throws异常处理 基本介绍 1)如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是…...

jvm内存结构

1. 栈 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 1.2栈内存溢出 栈帧过多导致栈内存溢出 /*** 演示栈内存溢出 java.lang.StackOverflowError* -Xss256k*/ public class Demo1_2 {private static int count;public static void main(String[] args) {try {meth…...

要刹车?生成式AI迎新规、行业连发ChatGPT“警报”、多国考虑严监管

4月13日消息&#xff0c;据中国移动通信联合会元宇宙产业工作委员会网站&#xff0c;中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等&#xff0c;共同发布“关于元宇宙生成式人工智能&#xff08;类 ChatGPT&#xff09;应用的行业提示”。提示内…...

轻松掌握Qt FTP 机制:实现高效文件传输

轻松掌握Qt FTP&#xff1a;实现高效文件传输一、简介&#xff08;Introduction&#xff09;1.1 文件传输协议&#xff08;FTP&#xff09;Qt及其网络模块&#xff08;Qt and its Network Module&#xff09;QNetwork:二、QNetworkAccessManager上传实例&#xff08;Qt FTP Upl…...

用AI帮我写一篇关于FPGA的文章,并推荐最热门的FPGA开源项目

FPGA定义 FPGA&#xff08;Field Programmable Gate Array&#xff09;是一种可编程逻辑器件&#xff0c;可以在硬件电路中实现各种不同的逻辑功能。与ASIC&#xff08;Application Specific Integrated Circuit&#xff0c;特定应用集成电路&#xff09;相比&#xff0c;FPGA…...

从兴趣或问题出发

当我们还沉寂在移动互联网给生活带来众多便利中&#xff0c;以 ChartGPT 为代表的 AI 时代已彻底到来。科技的发展&#xff0c;时刻在改变着我们的生活&#xff0c;我们需要不断地学习新知识和掌握新技能才能享受变化带来的便利&#xff0c;以及自身不被社会淘汰。 因此&#…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...