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

相关推荐
DarkAthena11 分钟前
AI生成技术报告:GaussDB与openGauss的HTAP功能全面对比
数据库·gaussdb
T0038 分钟前
保姆级教学--黑马点评,批量获取用户登录token及jemeter多线程测试
redis
心月狐的流火号1 小时前
分布式锁技术详解与Go语言实现
分布式·微服务·go
Seven971 小时前
Redis支持事务吗?了解Redis的持久化机制吗?
redis
DemonAvenger2 小时前
高效JOIN操作:多表关联查询技巧与实战经验分享
数据库·mysql·性能优化
麦兜*2 小时前
【Prometheus】 + Grafana构建【Redis】智能监控告警体系
java·spring boot·redis·spring·spring cloud·grafana·prometheus
小云数据库服务专线3 小时前
GaussDB 数据库架构师修炼(十八) SQL引擎-分布式计划
数据库·数据库架构·gaussdb
努力买辣条9 小时前
基于 Docker 的高可用 WordPress 集群部署:分布式 Nginx + Keepalived、MySQL 主从复制与 ProxySQL 读写分离
分布式·nginx·docker
haogexiaole11 小时前
Redis优缺点
数据库·redis·缓存