全书目录

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

第十章:原子操作、事务、Lua —— Redis 的“快”不是乱快,而是命令级原子

1 分钟 376 字 第 213 / 962 个阅读单元

Redis 很多单条命令天然就是原子的。

例如:

bash
INCR page:100:views
HINCRBY inventory:sku:10088 reserved 1
SADD online:room:88 "user:1001"
ZADD leaderboard:season:2026 1500 "user:1001"

这意味着:

  • 你不需要自己加数据库行锁来保护这些单步操作
  • 同一个 Redis 实例上,这些命令执行时不会被中间打断
#1. 事务:MULTI / EXEC / DISCARD / WATCH

Redis 官方文档对事务给出两条最重要的保证:

  • 事务中的命令会按顺序串行执行
  • EXEC 之前如果连接断了,则不会执行;EXEC 之后则会执行

最基础事务:

bash
MULTI
INCR article:88:views
INCR article:88:likes
EXEC

带乐观锁的 WATCH

bash
WATCH inventory:sku:10088
GET inventory:sku:10088
MULTI
DECR inventory:sku:10088
EXEC

如果在 WATCHEXEC 之间 key 被别人改了,事务会中止。

#2. 但 Redis 事务不是关系型数据库那种“万能事务”

它更像:

text
把几条命令打包成一个不可插队的执行段

而不是:

text
完整 SQL 世界里那种复杂回滚、隔离级别、跨表一致性体系
#3. Lua / 服务端脚本

当你发现:

  • 单条命令不够
  • 事务还需要带条件判断
  • 多步操作必须绝对贴在一起

这时常见做法就是把逻辑放到 Redis 端执行。

比如限流或安全释放锁。