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

相关推荐
迷途呀7 分钟前
新闻头条后端:新闻缓存模块
前端·redis·python·缓存·fastapi
ClickHouseDB11 分钟前
ClickHouse 26.6 版本发布说明
数据库
Wang's Blog14 分钟前
Java框架快速入门:深入MyBatis-Plus高级DML操作(ID策略·逻辑删除·乐观锁)
java·数据库·mybatis
她说可以呀41 分钟前
RabbitMQ Publisher_Confirms(发布确认)
分布式·rabbitmq·ruby
记忆停留w11 小时前
从单体到微服务:Redis 协同 MySQL、Milvus、MinIO 搭建企业级RAG/AI Agent脚手架架构
大数据·人工智能·redis·微服务·ai·架构·milvus
小二·11 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手12 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌12 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
蓝天下的守望者12 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库