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

相关推荐
BD_Marathon5 小时前
【MySQL】函数
android·数据库·mysql
她说..6 小时前
Redis项目应用总结(苍穹外卖/黑马头条/乐尚代驾)
java·数据库·redis·缓存·消息队列·redisson·geo
蒋士峰DBA修行之路6 小时前
实验二十 GaussDB逻辑备份恢复实验
数据库·gaussdb
kjl5365667 小时前
Redis配置文件(redis.conf)
redis·bootstrap·php
gsfl7 小时前
Redis 常见面试题
数据库·redis·缓存
会开花的二叉树7 小时前
C++分布式语音识别服务实践
c++·分布式·语音识别
Morpheon8 小时前
A Guide to Data System Storage: From Basics to Advanced File Structures
数据库
yzx9910139 小时前
Django 配置与安装完整指南
数据库·django·sqlite
u01040583610 小时前
电商返利APP的秒杀活动架构:如何通过本地缓存(Caffeine)+ 分布式锁应对瞬时高并发?
分布式·缓存·架构