一提到 Redis 原子性,很多人会直接想到 Lua 或 MULTI/EXEC。它们确实能让一段逻辑在 Redis 主线程上连续执行,但这不等于关系数据库里的事务。

Redis 事务没有自动回滚;Lua 原子执行,但执行期间会阻塞其他命令;WATCH 是乐观锁,冲突后需要客户端重试。

先把机制边界说清楚

这一篇讨论 Redis 内部的原子执行边界,不讨论分布式事务。Redis 可以保证单实例命令序列的执行语义,不能替代跨系统一致性协议。

整体路径

Pipeline、事务、Lua 的边界

上面这张图先把主线铺开:减 RTT、队列顺序和脚本原子性是三件事。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • MULTI 后命令先入队,EXEC 时按顺序执行,中间不会穿插其他客户端命令。
  • Redis 事务不提供传统回滚,运行期错误不会撤销前面已执行命令。
  • WATCH 通过监视 key 的修改实现乐观并发控制,冲突后 EXEC 返回失败。
  • Lua 和 Functions 在服务器端执行,可以减少网络往返,但脚本必须短小可控。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

把复杂业务逻辑塞进 Lua,会把 Redis 主线程变成业务执行器。原子性越强,阻塞风险越集中。

典型问题:用机制化例子排查

  • 库存扣减、限流计数、条件删除适合短 Lua。
  • 复杂订单流程、外部 RPC、循环扫描不应该写进 Lua。
  • 脚本要有 key 参数约束,Cluster 下避免跨 slot。
  • 客户端要处理 WATCH 冲突和脚本超时,不要假设一次必成功。

收束:一句判断

Redis 的原子性适合小而确定的状态变更,不适合承载整段业务事务。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码