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 挂了的可能性极小,所以保证可用性。

相关推荐
SQL-First布道者7 分钟前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
翼龙云_cloud21 分钟前
阿里云国际版代理商:OSS自定义域名绑定与HTTPS配置排障教程
数据库·阿里云·https·云计算
日常筹谋记25 分钟前
ATS选不对运维两行泪:数据中心市电与柴发切换场景的双电源自动转换开关选型笔记
运维·数据库·笔记
小的~~31 分钟前
面试被问分布式锁,我差点语塞…直到搞懂了Redis、ZooKeeper和etcd的“三国杀”
redis·分布式·面试
小蒜学长41 分钟前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
山甫aa1 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
JavaPub-rodert1 小时前
MongoDB 常用命令和常见问题大全
数据库·mongodb
武科大许志伟1 小时前
从并行进化到分布式进化计算读 A Survey on Distributed Evolutionary Computation
人工智能·分布式·演化计算
晚安code2 小时前
Redis 内存淘汰策略实战:什么时候淘汰、怎么选、怎么防缓存击穿
java·redis·缓存
Dovis(誓平步青云)3 小时前
从Redis指标采集到异常告警:redis_exporter + Prometheus 完整实战
服务器·数据库·人工智能·redis·架构·prometheus·vibe coding