Redis分布式锁

一、介绍

本质上是一组服务器给其他服务器提供加锁解锁的服务(控制其他节点互斥)

最基本流程:

执行业务逻辑前先尝试设置一组 key value,设置成功就代表加锁成功,期间其他服务器再次设置相同 key 发现已经被设置了代表加锁失败,执行完逻辑之后删除 key 代表解锁。也就是 setnx 和 del 命令。

二、优化

1、过期时间

为了防止服务器出问题无法解锁,所有的锁都要在设置的时候加上过期时间。

注意必须使用 set ex nx 一条命令,保证原子性。

2、校验 id

如果遇到服务器1加锁,立即服务器2解锁,那就相当于白加锁了。

所以每个服务器编号,把 value 设置成编号,解锁的时候检测是不是同一个服务器加锁解锁的

3、lua 脚本

但是检测编号和解锁这时两个步骤,不能保证原子性,且事务并不能保证执行成功,所以 Redis 内嵌 lua 脚本,把写好的 lua 逻辑上传到 redis 服务器,在客户端执行就是原子的了。

所以 lua 脚本也是 Redis 事务的上位方案

4、动态续约、看门狗

没法保证每次设置过期时间的时长是合理的,所以使用动态续约的方式,即还没执行完任务前重新设置一次过期时间,相当于再续一段时间,直到任务结束。

当然要有专门负责的线程来做,称为看门狗,一个服务器挂了,看门狗也随之挂掉就能保证正常解锁释放。

5、redlock 算法

如果提供分布式锁的 Redis 挂了怎么办?

可以用哨兵模式的高可用,但是主从节点之间同步有延迟,可能造成数据丢失,所以官方给出 redlock 算法,即引入多组 Redis 哨兵 + 主从模式,每组都进行加锁和解锁,当达到一半的时候视为成功,由于多组 Redis 挂了的可能性极小,所以保证可用性。

相关推荐
神龙天舞200110 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈11 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a12 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事12 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四13 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA13 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜13 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
香菜TTT14 小时前
Kafka_深度解析_从架构原理到生产实践
分布式·架构·kafka·linq
每天都要进步哦15 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
不剪发的Tony老师15 小时前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql