全书目录

第九篇:Redis 完全指南 —— 软件城市实时调度中心宇宙

第十一章:分布式锁 —— Redis 能做,但你必须知道边界

1 分钟 365 字 第 214 / 962 个阅读单元

Redis 官方文档专门有一整篇讲分布式锁,而且讲得很克制。

最小安全单实例锁做法:

bash
SET lock:order:9001 token-abc NX PX 30000

意思是:

  • NX:只有 key 不存在时才设置成功
  • PX 30000:30 秒自动过期
  • token-abc:锁的拥有者签名

为什么一定要有随机 token?

因为释放锁时不能直接 DEL,否则可能删掉别人的锁。

Redis 官方文档在 Redis 8.4 之后给出的安全释放方式是:

bash
DELEX lock:order:9001 IFEQ token-abc

而旧版本常见写法是 Lua:

lua
if redis.call("get", KEYS[1]) == ARGV[1] then
  return redis.call("del", KEYS[1])
else
  return 0
end
#这部分最重要的不是“会写”,而是“知道别神化”

Redis 官方文档自己也反复强调了边界:

  • 单实例锁是有适用范围的
  • 基于主从故障切换的简单锁方案不安全,因为复制是异步的
  • Redlock 试图提高分布式环境下的安全性
  • 但如果你极度关心一致性,仍然要认真理解 fencing token、时钟漂移、网络分区这些问题

所以最务实的判断是:

text
Redis 分布式锁适合“协调”
不适合让你偷懒绕过真正的一致性设计