Redis 很多单条命令天然就是原子的。
例如:
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之后则会执行
最基础事务:
MULTI
INCR article:88:views
INCR article:88:likes
EXEC带乐观锁的 WATCH:
WATCH inventory:sku:10088
GET inventory:sku:10088
MULTI
DECR inventory:sku:10088
EXEC如果在 WATCH 到 EXEC 之间 key 被别人改了,事务会中止。
#2. 但 Redis 事务不是关系型数据库那种“万能事务”
它更像:
把几条命令打包成一个不可插队的执行段而不是:
完整 SQL 世界里那种复杂回滚、隔离级别、跨表一致性体系#3. Lua / 服务端脚本
当你发现:
- 单条命令不够
- 事务还需要带条件判断
- 多步操作必须绝对贴在一起
这时常见做法就是把逻辑放到 Redis 端执行。
比如限流或安全释放锁。