上一篇
最新动态:截至2025年7月,Redis官方在7.2版本中进一步优化了分布式锁的原子性操作性能,新增了EXAT
和PXAT
参数支持更精确的过期时间控制,同时社区推荐使用Redlock算法的改进版本来应对极端网络分区场景。
想象一下这个场景:你的电商系统在秒杀活动中,用户疯狂点击“立即购买”,如果没有锁机制,很可能出现超卖——10台手机卖给100个人,单机环境下用synchronized
或ReentrantLock
就能解决,但在分布式系统中,服务部署在多台机器上,就得靠分布式锁来协调了。
Redis因为高性能和丰富的原子命令,成了实现分布式锁的热门选择。
SETNX
+ EXPIRE
(已淘汰)老版本常用组合,但存在原子性问题:
SETNX lock_key 1 # 尝试加锁(1表示锁的value,可自定义) EXPIRE lock_key 10 # 设置10秒过期
问题:如果SETNX
成功但EXPIRE
执行前服务崩溃,锁永远不释放!
SET
命令扩展参数(推荐)Redis 2.6.12之后,单条命令实现原子操作:
SET lock_key unique_value NX EX 10
NX
:仅当key不存在时设置(加锁) EX 10
:10秒后自动过期(防死锁) unique_value
:客户端唯一标识(通常用UUID或线程ID),用于安全释放锁 # 示例:客户端A加锁(value为"clientA_123") SET order_lock_101 clientA_123 NX PX 30000
OK
,表示加锁成功 nil
,说明锁已被其他客户端持有 if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end
为什么用Lua:避免误删其他客户端的锁(比如客户端A的锁已过期,B拿到锁后A才执行DEL)
如果业务执行时间可能超过锁过期时间,需启动守护线程定期续期:
# 检查锁归属并延长过期时间 EVAL "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('PEXPIRE', KEYS[1], ARGV[2]) else return 0 end" 1 order_lock_101 clientA_123 30000
当Redis为集群模式时,官方推荐Redlock:
:Redis分布式锁的核心是原子性加锁和安全释放,虽然实现简单,但在高并发、网络不可靠的场景下仍需谨慎,对于金融级场景,建议结合ZooKeeper或etcd等强一致性方案做兜底。
本文由 肖畴 于2025-07-30发表在【云服务器提供商】,文中图片由(肖畴)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/480004.html
发表评论