回顾分布式锁
Distributed Lock by redis 一、为什么需要分布式锁? 在分布式系统中,当多个进程/服务需要共享同一资源时,本地锁无法跨进程生效。分布式锁通过一个全局可见的"锁资源"实现互斥访问,保证同一时刻只有一个客户端能操作共享资源。 二、Redis实现分布式锁的核心方法 1. 基本加锁操作 使用SET命令的原子性参数实现: SET lock_key unique_value EX 30 NX NX:仅当键不存在时设置成功(实现互斥) EX 30:设置30秒自动过期(防止死锁) unique_value:唯一标识(如UUID),用于安全释放锁 2. 释放锁的正确姿势 通过Lua脚本保证原子性验证和删除: if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end 避免误删其他客户端的锁(例如:客户端A的锁过期后,B获取锁,此时A误删B的锁)。 三、高级特性与问题解决 1. 锁续期(看门狗机制) 问题:任务执行时间超过锁过期时间,导致锁提前释放。 解决:Redisson等客户端通过后台线程定期续期(如每10秒续期一次)。 2. 可重入锁实现 原理:记录持有锁的客户端和重入次数。 示例: local counter = redis.call(“HGET”, KEYS[1], ARGV[1]) if counter then […]