- Redis分布式锁
- 问题描述
- 解决方案
- 设置锁的过期时间
- 设置uuid防止误删
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程,多进程分布再不同的机器上,这将使原单机部署情况下的并发控制锁策略失效。
解决方案使用Redis实现分布式锁。
命令:
SET key value NX EX second
EX second:设置键的过期时间为second秒
NX:只有在键不存在时,才对键进行设置操作。SET key value NX 等同于 SETNX key value。
删除锁的操作:
del key
设置锁的过期时间- 首先想到通过expire设置过期时间(缺乏原子性:如果在setnx和expire之间出现异常,锁也无法释放)
- 在set时指定过期时间(推荐)
场景:如果业务逻辑的执行时间是7s。执行流程如下
-
index1业务逻辑没执行完,3秒后锁被自动释放。
-
index2获取到锁,执行业务逻辑,3秒后锁被自动释放。
-
index3获取到锁,执行业务逻辑
-
index1业务逻辑执行完成,开始调用del释放锁,这时释放的是index3的锁,导致index3的业务只执行1s就被别人释放。
最终等于没锁的情况。
解决:setnx获取锁时,设置一个指定的唯一值(例如:uuid);释放前获取这个值,判断是否自己的锁
设置uuid防止误删
使用LUA脚本保证删除的原子性。



