Redis分布式锁是解决分布式系统并发问题的关键技术,通过SETNX和EXPIRE命令实现跨进程互斥访问。本文深入解析Redis分布式锁的实现原理,包括原子性操作SET命令、防误删的Lua脚本解锁、锁续期Watch Dog机制以及高可用Redlock算法。掌握这些核心要点能有效应对分布式环境下的资源竞争问题,确保数据一致性。无论是面试准备还是实际开发,了解Redis分布式锁的底层机制都至关重要。本文还提供Java面试宝典资源,助你轻松应对技术面试挑战。
作为后端工程师,分布式锁是面试必考题。今天咱们就深挖Redis分布式锁的实现原理,帮你轻松应对面试提问!
在分布式系统中,多个服务实例可能同时操作共享资源(比如扣减库存)。本地锁(如Java的synchronized)只能控制单个JVM内的线程,跨服务就失效了。这时就需要Redis分布式锁实现跨进程互斥。
核心目标:保证在任意时刻,只有一个客户端能持有锁!
最简单的方式是利用Redis的两个命令:
SETNX key value
:当key不存在时设置值(返回1),存在则不设置(返回0)。这步就是争抢Redis分布式锁。EXPIRE key seconds
:给key设置过期时间,防止客户端崩溃导致锁永远不释放。# 伪命令示例
SETNX lock:order:1234 client1 # 尝试加锁
EXPIRE lock:order:1234 30 # 设置30秒过期
⚠️ 致命缺陷:SETNX和EXPIRE是两条独立命令,非原子操作!如果在SETNX成功后客户端崩溃,EXPIRE未执行,锁就变“永不过期”了!
Redis 2.6.12后,SET
命令支持NX(Not eXist)和EX/PX(过期时间)参数,完美解决原子性问题:
SET lock:order:1234 client1 NX EX 30
这条命令原子性地完成了:“当lock:order:1234不存在时,设置值为client1,并设置30秒过期时间”。这才是Redis分布式锁的安全基础!
你以为DEL key
就完事了?考虑这个场景:
DEL
,删除了B的锁!解决方案:解锁时验证锁的值(客户端标识)是否匹配!使用Lua脚本保证原子性:
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
如果业务执行时间超过锁的过期时间怎么办?锁可能被其他客户端获取,导致数据错乱!
续期机制:获取锁成功后,启动一个后台线程(看门狗),定期(比如每10秒)检查锁是否仍持有并重置过期时间(如重置为30秒)。Redisson等库提供了现成实现。
单节点Redis宕机怎么办?Redis作者提出了Redlock算法(分布式锁的分布式实现):
SET key random_value NX PX T
命令。📌 关键点:独立部署、N/2+1多数派、时钟依赖性强(建议使用NTP同步)。
SET key value NX EX
原子命令。📌 面试资源利器:
备战2025年Java面试?这份Java面试宝典助你通关:
🔗 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
👉 温馨小提示:如果你计划购买面试鸭会员,记得通过 面试鸭返利网 下单,可额外获得 25元返利 哦!省心又实惠!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包