花瓣小跑 发表于 2025-6-9 10:23:38

Redis 分布式锁深度剖析:从原理到实战,一篇全懂!

Redis 分布式锁深度剖析:从原理到实战,一篇全懂!

一、为什么必要分布式锁?

在分布式系统中,多个进程/线程/服务可能同时操纵同一资源,容易导致数据竞争、重复提交、状态错乱等题目。此时必要分布式锁来确保同一时间只有一个客户端操纵临界资源。
二、Redis 为啥得当做分布式锁?

https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9pbWdfY29udmVydC9kODRiNWE3YjMxNWRmYzJiM2I3YTM5MmI1YzQ2NjBhYy5wbmc=


[*]支持原子操纵(SETNX、Lua)
[*]高性能、部署方便
[*]TTL 能主动释放死锁
[*]支持 key 的过期时间和可视化调试
三、单机 Redis 分布式锁的核心实现

✅ 实现方案:基于 SET 命令的原子操纵

SET lock_key unique_value NX EX 30
解释:


[*]lock_key:锁的名字
[*]unique_value:唯一标识该客户端,用于释放锁验证
[*]NX:只在 key 不存在时设置(SETNX)
[*]EX 30:锁超时时间,防止死锁
✅ 释放锁必须利用 Lua 保证原子性:

if redis.call("get",KEYS) == ARGV then
    return redis.call("del",KEYS)
else
    return 0
end
Python 示例(利用 redis-py):
import redis
import uuid

r = redis.StrictRedis()
lock_key = "my_lock"
client_id = str(uuid.uuid4())

# 加锁
result = r.set(lock_key, client_id, nx=True, ex=30)
if result:
    try:
      # 临界区代码
      pass
    finally:
      # 释放锁(Lua脚本)
      lua_script = """
      if redis.call("get", KEYS) == ARGV
      then return redis.call("del", KEYS)
      else return 0 end
      """
      r.eval(lua_script, 1, lock_key, client_id)
四、常见题目与优化点

✅ 设置过期时间很关键

制止步伐非常退出,锁不释放,导致死锁。
✅ 唯一标识必须保证全局唯一

不能用线程 ID、主机名,推荐利用 UUID。
✅ 释放锁必须校验身份

不能直接 DEL,必须校验是否是自己加的锁。
五、RedLock:Redis 官方分布式锁算法(多节点)

页: [1]
查看完整版本: Redis 分布式锁深度剖析:从原理到实战,一篇全懂!