【跳槽面试】Redis中分布式锁的实现

news2024/11/18 10:56:09

分布式锁常见的三种实现方式:

  1. 数据库乐观锁;
  2. 基于Redis的分布式锁;
  3. 基于ZooKeeper的分布式锁。

本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的。

在Redis中,分布式锁的实现主要依赖于Redis的原子操作和事务功能。下面是一些常见的实现策略:

SETNX(Set if Not eXists):

使用SETNX命令尝试设置一个键值对,如果键已经存在,则设置失败。通过这个特性,可以实现一个简单的分布式锁,例如:

SETNX lock_key "locked"

如果SETNX成功,则表示获取到了锁,接下来可以执行需要同步的逻辑。如果SETNX失败,则表示锁已经被其他客户端持有,当前客户端需要等待或者重试。

EXPIRE:

使用EXPIRE命令为锁设置一个过期时间,当锁过期后,其他客户端可以重新获取锁。这样可以避免死锁和饥饿问题。例如:

SETNX lock_key "locked"  EXPIRE lock_key 10

这里将锁的过期时间设置为10秒。当锁过期后,其他客户端可以重新获取锁。

RedLock算法:

RedLock算法是一种更加复杂的分布式锁算法,它通过对比主节点和从节点的数据来避免脑裂问题,并且通过随机退下来解决死锁问题。RedLock算法的实现需要多个Redis节点之间的协同工作,因此需要使用Redis集群来支持。

在实现分布式锁时,还需要注意一些问题:

锁的粒度:在实现分布式锁时,需要考虑锁的粒度。如果锁的粒度太粗,可能会导致并发性能下降;如果锁的粒度太细,则可能会导致锁的竞争加剧。需要根据实际情况选择合适的锁粒度。

锁的超时:为了避免死锁和饥饿问题,可以为锁设置一个超时时间。当客户端在指定时间内无法获取到锁时,可以放弃或者重试。

锁的续约:在一些场景下,客户端在获取到锁之后需要执行一些耗时的操作,这时可以考虑使用Redis的事务功能来实现锁的续约,以确保在执行耗时操作期间不会被其他客户端抢占锁。

可重入性:如果一个线程已经获取了锁,那么它应该能够再次请求加锁,而不会造成死锁。

高性能和高可用:加锁和解锁的操作需要尽可能地高效,并且要保证高可用性,避免分布式锁失效。

安全性:只有持有锁的客户端才能删除它,其他客户端不能删除。这样可以防止非法删除锁的情况发生。

原子性:在获取锁和设置过期时间这两个操作中,需要保证原子性。如果程序在执行完SETNX之后突然崩溃,导致锁没有设置过期时间,那么将会发生死锁。因此,需要将这两个操作放在一个事务中,以确保原子性。

技术交流

一个人走的很快,一群人走的更远。


图片

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

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

相关文章

【JavaEE Spring】SpringBoot 配置文件

SpringBoot 配置文件 1. 配置文件的作用1.1 配置文件的说明1.2 SpringBoot 配置文件 2. 配置文件的格式特殊说明 3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 缺点分析 4. yml 配置文件说明4.1 yml 的基本语法4.2 yml 使⽤进阶4.2.1 yml…

Java基础 - 07 Set之Set,AbstractSet

上边几篇,我们对java的List集合进行相关介绍,了解了关于List集合下的相关实现类的方法或者接口。 自本篇开始,将围绕java的Set进行介绍,也是对我java知识的巩固吧,处理业务越多,发现自己对基础知识的薄弱&…

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录 Contact.h说明: 结构体与头文件的包含: ​编辑 函数在头文件的声明与定义: Contact.c中各个函数的实现: 1.检查链表中的数据是否满了,满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…

Vagrant安装Oracle Data Guard环境示例

在Windows 11下,通过Vagrant安装标准的Data Guard环境(默认为non-CDB模式),耗时约26分钟,共生成2台虚机。以下为安装日志: ...host2: Welcome to DGMGRL, type "help" for information.host2: C…

b+树的理解

二叉树: 每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 二叉查找树: 在二叉树的基础上增加了一个规则,左子树的所有节点都小于它的根节点,右子树的所有节点都大于他的根节点。 二叉查找树…

Beego之Beego快速入门

1、beego快速入门 1.1 新建项目 新建一个项目: [rootzsx src]# bee new quickstart 2023/02/19 15:55:50.370 [D] init global config instance failed. If you do not use this, just ignore it. open conf/app.conf: no such file or directory 2023/02/19 1…

易优demo网站测试结果

易优demo网站测试结果-06 1、信息收集 网站账号:admin 密码:Aa123456 2、存在的漏洞 2.1 后台弱口令漏洞 http://eyoucms-s347fqn.gxalabs.com/login.php?sAdmin/login网站账号:admin 密码:Aa123456 成功登陆 2.2 代码远程…

递归、搜索与回溯算法(专题二:深搜)

往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 (2&#xff09…

linux基础学习(5):yum

yum是为了解决rpm包安装依赖性而产生的一种安装工具 1.yum源 1.1配置文件位置 yum源的配置文件在/etc/yum.repos.d/中 *Base源是网络yum源,也就是需要联网才能使用的yum源。默认情况下,系统会使用Base源 *Media源是光盘yum源,是本地yum源…

openjdk源码了解

openjdk给出debug配置选项,common/autoconf/jdk-options.m4 AC_DEFUN_ONCE([JDKOPT_SETUP_DEBUG_LEVEL], [################################################################################# Set the debug level# release: no debug information, all opti…

Jenkins实现CICD(1)_Windows10 安装Jenkins

文章目录 一、打开Jenkins官网,下载安装包二、安装Jenkins三、JAVA环境_JDK17下载安装(Windows版)四、将jdk-17添加到系统环境变量五、jenkins关联jdk-17六、安装常用插件(例如:git、gitlab、钉钉) 一、打开Jenkins官网&#xff0…

PDshell16逆向PostgreSQL 工程显示字段comment备注

现状:当刚逆向成功的表结构是没有原来表结构中的,comment备注如下 然后pd逆向工程的sql已经返回了这个备注的含义 解决方案: 1、设置显示注释列 tools——Display Preferences…如下 勾选-按照下面得方式勾选这三个 复制这里的VBS脚本&a…

Python数据分析案例37——基于分位数神经网络(QRNN)的汇率预测

案例背景 我导师的研究方向是少有的做"分位数回归"方向,作为研究机器学习深度学习方向的我自然就继承了这个特色,改进出了很多特殊结合方法,我会结合各种机器学习方法和各种分位数回归的方法。 之前写过分位数随机森林&#xff0…

哈希表 -- 刷题(查找算法)

目录 💻哈希 -- 知识点 🐍刷题 🌼1,雪花 AC -- vector AC -- 链式前向星 🌼2,公式 💻哈希 -- 知识点 线性表 和 树表,通过比较关键字进行查找 而 散列表,基于…

【MATLAB源码-第119期】基于matlab的GMSK系统1bit差分解调误码率曲线仿真,输出各个节点的波形以及功率谱。

操作环境: MATLAB 2022a 1、算法描述 GMSK(高斯最小频移键控)是一种数字调制技术,广泛应用于移动通信,例如GSM网络。它是一种连续相位调频制式,通过改变载波的相位来传输数据。GMSK的关键特点是其频谱的…

【接上篇】二、Flask学习之CSS(下篇)

上篇&#xff1a;二、Flask学习之CSS 3.8hover hover是用来美化鼠标悬停的效果的&#xff0c;当鼠标停放在某个区域&#xff0c;就会执行对应的hover操作。可以操作本标签的内容&#xff0c;也可以操作本标签下某一个标签的内容 3.9after <!DOCTYPE html> <html l…

Navicat平替工具,一款免费开源的通用数据库工具

前言 前段时间有小伙伴在群里提问说&#xff1a;因为公司不允许使用破解版的Navicat&#xff0c;有好用的Navicat平替工具推荐吗&#xff1f;今天分享一款免费开源的通用数据库工具&#xff1a;DBeaver。 DBeaver工具介绍 DBeaver是一款免费的跨平台数据库工具&#xff0c;适…

灵活扩展:深入理解MyBatis插件机制

第1章&#xff1a;MyBatis插件的重要性 大家好&#xff0c;我是小黑&#xff0c;咱们今天要聊的是MyBatis插件&#xff0c;MyBatis&#xff0c;大家都不陌生&#xff0c;它是一个ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;让咱们在操作数据库时能更加优雅。但今…

“深入理解 Docker 和 Nacos 的单个部署与集成部署“

目录 引言&#xff1a;Docker Nacos 单个部署1.1 什么是 Docker&#xff1f;Docker 的概念和工作原理Docker 为什么受到广泛应用和认可 1.2 什么是 Nacos&#xff1f;Nacos 的核心功能和特点Nacos 在微服务架构中的作用 1.3 Docker 单个部署 Nacos Docker Nacos 集成部署总结&a…

sfml使用opengl着色器实现2d水面波浪

SFML中使用GLSL着色器来绘制水波。 效果 代码 #include <SFML/Graphics.hpp> #include <iostream>int main() {const int WIDTH = 800;