Redis分布式锁使用及说明

2025-01-08 15:50
文章标签 使用 redis 说明 分布式

本文主要是介绍Redis分布式锁使用及说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo...

Redis分布式锁

如果追求高可用性(AP) 就采用redis

如果追求高一致性(CP) 就采用zookeeper

加锁方式

set lockKey uniqueId NX PX expireTime
  • lockKey可以根据业务自己定义(如订单)
  • uniqueId是为了不解错锁(uniqueId可以是session Id 或者线程Id等)

怎么会解错锁?举个小案例吧

  • S1 获得Lock,ttl时间5s,实际执行了7s
  • S2 获得LocChina编程k,ttl时间5s,实际执行了4s

如果没有uniqueId S1在第7s的时候解锁,或解了S2的锁

  • NX代表当前不存在锁的时候才能加锁成功
  • PX毫秒过期时间,如果是秒就用ES

解锁方式

通过Lua脚本实现原子操作,先进行uniqueId对比操作,如果相同,则执行de编程China编程l解锁操作

if redis.call("GET",KEYS[1]) == ARGV[1]
then
return redis.call("DEL",KEYS[1])
else
return 0
end

续期

当分布式锁到达了超时时间,但是业务并没有完成,则将对锁进行续期

S1 获得Lock,ttl时间5s,实际执行php了7s,如果没有续期那么S1后2秒就没有锁

续期的两种方式:

  • 开启一个后台守护线程,每隔3秒对key设置ttl时间5S进行续期,当主线程执行完操作之后,对key进行解锁,那么守护进行也随之消亡
  • 采用异步任务,获得锁后,把所有锁的线程放到一个Map里,然后每隔几秒进行轮询,如果客户端还持有锁(即Map中还存在),就延长ttl时间

RedLock算法对应的场景 主节点挂掉后,lockkey还未同步到从节点,导致从节点上没有lockkey(发生概率很小,面试官喜欢在AP模型里解决CP模型的问题)

  • 对3个完全独立的redis主服务器一次获得锁(一般要基数个,为了少数服从多数)
  • 如图请求时间4000-1000=3s小于TTL时间5s,并且至少有半数(大于2个)获得锁,才算真正获得锁

缺点(已废弃,不常用,因此只学习算法思想)

  • 复杂度高,需要设计一些算法去实现
  • 不可靠,js如果redis主服务器宕机,会影响到锁的使用(即少数服从多数会受影响)
  • 性能瓶颈,需要访China编程问多个redis实例
  • 另外最要命的是还需要求所有redis主服务器的系统时间一致性

Redis分布式锁使用及说明

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Redis分布式锁使用及说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152982

相关文章

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome