Redis分布式锁实现原理:避免并发冲突
(4) feilong.org 修订于2026-07-25 20:54:04 Redis教程什么是分布式锁?
在分布式系统中,多个节点可能同时操作共享资源。为确保数据一致性,需通过分布式锁机制协调访问权限。Redis凭借其高性能和原子操作能力,成为实现分布式锁的常用工具。
核心原理:SETNX + 过期时间
Redis通过SETNX(Set if Not Exists)命令实现锁的基本逻辑:
- 若键不存在,则设置键值并返回1(获取锁成功);
- 若键已存在,则返回0(获取锁失败)。
为避免死锁,需结合过期时间(TTL):
|
1 2 3 4 5 6 7 8 9 10 11 |
import redis r = redis.Redis(host='localhost', port=6379, db=0) lock_key = 'resource_lock' acquired = r.set(lock_key, 'locked_value', nx=True, ex=10) 设置10秒过期时间 if acquired: try: 执行业务逻辑 pass finally: r.delete(lock_key) 释放锁 |
> 关键点:nx参数确保仅在键不存在时设置,ex参数避免锁永久占用。
高级实现:Lua脚本保证原子性
直接使用Redis命令可能因网络延迟导致误删锁。通过Lua脚本实现原子操作:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- 获取锁 if redis.call("exists", KEYS[1]) == 0 then return redis.call("set", KEYS[1], ARGV[1], "NX", "EX", tonumber(ARGV[2])) else return 0 end -- 释放锁 if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end |
在Python中调用:
|
1 2 3 |
pipe = r.pipeline() pipe.eval(script, keys=[lock_key], args=['locked_value', '10']) result = pipe.execute() |
常见问题与解决方案
1. 锁未及时释放
- 原因:业务逻辑异常或超时;
- 解决:使用
|
1 |
try-finally |
确保释放操作,或设置较短TTL。
2. 误删其他节点的锁
- 原因:未校验锁值直接删除;
- 解决:通过Lua脚本校验锁值后再删除。
3. 单点故障风险
- 解决方案:采用Redlock算法(Redis官方推荐),在多个Redis实例上获取锁,提高容错性。
总结
Redis分布式锁的核心在于利用原子操作和过期时间机制,但需注意以下细节:
1. 锁的粒度应与业务场景匹配;
2. 避免长超时导致资源浪费;
3. 优先使用Lua脚本保证操作原子性。
通过合理设计,Redis分布式锁可有效解决并发冲突问题,为高并发系统提供可靠保障。
更新网址:https://feilong.org/redis-distributed-lock-principle
最初发布:20260725 08:54:04 feilong.org 于广州
加入收藏夹,查看更方便。