深入了解Redis-实战篇-分布式锁

news2025/2/24 21:53:49

深入了解Redis-实战篇-分布式锁

  • 一、故事背景
  • 二、知识点主要构成
    • 1、分布式锁基本原理
    • 2、不同实现方式对比
    • 3、基于redis的分布式锁
      • 3.1、获取锁
      • 3.2、释放锁
    • 4、Redisson的可重入锁原理
    • 5、Redisson的锁重试和WatchDog机制
  • 三、总结提升

一、故事背景

最近在系统的回顾redis相关的知识,总结成系列博客,方便回顾,也希望大家能给出意见,帮助我更快的成长;本篇博客主要介绍使用Redis如何实现短信登录功能;
系列:
深入了解Redis-基础篇
深入了解Redis-实战篇-短信登录

二、知识点主要构成

1、分布式锁基本原理

分布式锁的基本原理是通过在分布式环境下确保只有一个进程(或线程)能够获取到锁,从而避免并发操作引起的数据不一致问题。实现分布式锁通常需要满足以下两个条件:

  • 互斥:同一时刻只能有一个进程持有锁。
  • 有效性:即使在高并发、节点宕机等异常情况下,锁依然能正常释放。
  • 在这里插入图片描述

2、不同实现方式对比

在分布式环境下,有多种方式可以实现分布式锁,如基于数据库、基于ZooKeeper、基于Redis等。下面简要对比这几种实现方式:

  • 基于数据库:使用数据库表中的一条记录作为锁,通过数据库事务来保证互斥。但是这种方式性能较差,而且不够灵活,不推荐在高并发场景下使用。
  • 基于ZooKeeper:利用ZooKeeper的有序节点特性和临时节点特性来实现分布式锁。这种方式相对可靠,但是由于ZooKeeper本身的复杂性和维护成本较高,也不是最优选择。
  • 基于Redis:使用Redis的原子操作(如SETNX)和过期时间设置来实现分布式锁。这是目前最常用且高效的方式,因为Redis是内存型数据库,具有快速读写和高可用性的特点。
  • 在这里插入图片描述

3、基于redis的分布式锁

3.1、获取锁

  • 互斥:确保只有一个线程能获取锁

为了确保互斥性,我们可以利用Redis的SETNX命令,该命令在键不存在时设置键的值,返回1;如果键已经存在,返回0。通过SETNX操作,我们可以实现在同一时刻只有一个线程能够成功设置键,从而获取到锁。

SETNX lock_key 1

其中,lock_key是锁的名称,可以是任意字符串,1是表示锁的状态为已占用。

3.2、释放锁

  • 手动释放:持有锁的线程在完成任务后主动删除锁键。
DEL lock_key
  • 超时释放:在获取锁时,为锁设置一个合理的过期时间(超时时间),确保即使持有锁的线程发生异常,锁也能在一段时间后自动释放。
SET lock_key 1 EX 10

在上述例子中,锁的过期时间被设置为10秒。

4、Redisson的可重入锁原理

Redisson是一个Java的Redis客户端,提供了丰富的分布式工具包,其中包含了可重入锁的实现。可重入锁允许同一个线程多次获取同一把锁而不会被阻塞,同时保证释放锁的次数与获取锁的次数一致。

Redisson的可重入锁原理是基于Redis的SET数据结构实现的。当线程第一次获取锁时,Redisson会在Redis中保存锁的持有者信息和锁的计数器。当同一个线程再次获取锁时,Redisson会检测锁的持有者是否为当前线程,并将计数器加一。

5、Redisson的锁重试和WatchDog机制

Redisson的可重入锁还支持锁的自动续期和WatchDog机制,以保证长时间持有锁的线程不会因为执行时间过长而导致锁过期的问题。

锁重试:当线程获取锁失败时,Redisson会根据用户设置的重试次数和等待时间进行锁获取的重试,直至成功获取锁或者达到最大重试次数。

WatchDog机制:当线程成功获取锁后,Redisson会启动一个WatchDog线程用于定时续期锁的过期时间。如果持有锁的线程因为某些原因阻塞或者崩溃,WatchDog会在锁的过期时间快到期时进行自动续期,避免锁过期而被其他线程获取。

三、总结提升

Redis分布式锁是保障分布式系统数据一致性的重要工具,而Redisson则为Java开发者提供了强大且易用的分布式锁实现。通过了解分布式锁基本原理、不同实现方式对比以及Redisson的可重入锁原理及其特性,我们可以更好地在分布式环境下使用锁来确保数据的安全性和一致性。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

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

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

相关文章

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题,如何实现数据共享和同步数据、如何处理failover,数据共享的解决方案一般是SAN,数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案,数据同步方法采用的是MySQL rep…

Eclipse进行debug

目录 基本步骤三种执行方式 -- 键盘快捷键variables面板移除debug过的项目通过eclipse调用具有软件界面的项目进行debug各个variable颜色具有的意义 基本步骤 点击eclipse右上角debug按钮 调出debug面板 点击小蜘蛛图标(不是点绿色三角的Run) 此时会进…

FPGA实现NIC 100G UDP协议栈网卡,UltraScale+ 100G Ethernet Subsystem驱动,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、本25G/100G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHYUltraScale 100G Ethernet Subsystem流水线队列管理发送调度程序端口和接口数据路径以及发送和接收…

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格,这里有几个简单的步骤,可以帮助您完成这个转换过程。以下是需要注意的事项。 首先,我们先了解OCR(Optical Character Recognition,光学字符识别)技术。然后合理运用…

前端vue uni-app自定义精美海报生成组件

在当前技术飞速发展的时代,软件开发的复杂度也在不断提高。传统的开发方式往往将一个系统做成整块应用,一个小的改动或者一个小功能的增加都可能引起整体逻辑的修改,从而造成牵一发而动全身的情况。为了解决这个问题,组件化开发逐…

【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】

基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具,例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样,就无须创建昂贵的定制软件系统。 《快速构…

如何用DHTMLX组件为Web应用创建甘特图?(二)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一,DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

Git在VSCode中的使用

1.Git图像化界面进行项目初始化(git init) 2. Git图形化界面对文件进行操作 当我们创建一个文件时,该文件后面有一个U,表示文件未跟踪。 我们在管理工具中输入日志并提交代码,相当于做了两件事,将文件由“…

ABB机器人RAPID编程常用指令介绍2

ABB机器人RAPID编程常用指令介绍2 1. 程序运行停止指令 Break 应用:机器人在当前指令行立刻停止运行,程序运行指针指向下一行指令,可以用start键继续运行机器人 举例: … Break; … 与stop指令的区别可以参考下面的示意图: 2. 程序运行停止指令 Exit 应用:机器人在当前指…

分享 一个类似 ps 辅助线功能

效果图片: 提示:这里的样式我做边做了修改,根据个人情况而定。 //你也可以npm下载 $ npm install --save vue-ruler-tool特点 没有依赖可拖动的辅助线快捷键支持 开始使用 1. even.js /*** description 绑定事件 on(element, event, han…

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

Linux常用命令——dpkg-deb命令

在线Linux命令查询工具 dpkg-deb Debian Linux下的软件包管理工具 补充说明 dpkg-deb命令是Debian Linux下的软件包管理工具,它可以对软件包执行打包和解包操作以及提供软件包信息。 语法 dpkg-deb(选项)(参数)选项 -c:显示软件包中的文件列表&am…

【ASP.NET MVC】数据到客户端(7)

前文ViewBag数据在服务端动态生成页面,也可以传到客户端浏览器供JS使用。 一、数据从控制器到客户端 前文介绍,动态生成页面时,控制器的数据 并没有传递到 客户端,而是给自己来用,生成View 再利用http传递到客户端浏…

rn打包react-native-orientation报错

rn 打包时控制台报Task :react-native-orientation:verifyReleaseResources FAILED 解决:修改node_modules下react-native-orientation依赖中的build.gradle文件

拓数派入选中国信通院“铸基计划”「高质量数字化转型产品及服务全景图」...

7月27日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开,本次大会深度展示了中国信通院在数字化领域的工作成果,并正式发布了《高质量数字化转…

FineReport SQL查询分页

参考:https://help.fanruan.com/finereport/doc-view-4795.html 参考示例为填报页面,以下为分页预览模式下SQL查询分页的制作。 参数说明: 模版参数:gPageSize每页显示数量、gPageNo当前页数 数据集结果:totalcnt总数…

S形速度曲线轨迹规划(SMART PLC梯形图源代码)

有关S形速度曲线轨迹规划相关内容,可以查看下面相关文章,这里不再赘述公式推导过程。 S速度曲线轨迹规划问题(普通变频位置闭环控制算法介绍+SCL代码)_RXXW_Dor的博客-CSDN博客位置控制用PD控制器,详细内容介绍请查看下面博客文章:PD控制器算法详细解读_RXXW_Dor的博客-CS…

宠物医疗进化:互联网宠物医院开发改变兽医服务方式

随着互联网的飞速发展,各行各业都在积极探索数字化转型的可能性。而宠物医疗行业也不例外。互联网宠物医院的开发将为宠物主人和兽医带来许多好处。下面我们将介绍一些互联网宠物医院开发的好处。   提供便利的服务:互联网宠物医院的开发将使宠物主人能…

C# Blazor 学习笔记(5):blazor文件夹组件引入

文章目录 前言文件夹组件引入文件夹分类文件引入解决方法 前言 为了更好的组件化管理整个文件,我选择使用分文件夹对项目组件进行分类。 文件夹组件引入 文件夹分类 Shared:Layout布局空间放置地方,由于默认创建,动也不好动&a…

一元三次方程求解

一元三次方程求解 题目描述提示输入输出格式输入格式输出格式 输入输出样例输入样例输出样例 算法分析A C 代码 题目描述 有形如: a x 3 b x 2 c x d 0 ax^3bx^2c^xd0 ax3bx2cxd0一元三次方程。给出该方程中各项的系数 ( a a a, b b b,…