2026/4/6 13:57:44
网站建设
项目流程
系列导读本篇将深入讲解 Redis 事务机制包括事务命令、WATCH 监控、Lua 脚本等核心内容。文章目录一、事务基础1.1 事务特性1.2 事务执行流程二、事务命令详解2.1 基本事务2.2 取消事务2.3 事务错误处理三、WATCH 监控3.1 乐观锁机制3.2 取消监控3.3 实战示例转账四、Lua 脚本4.1 EVAL 命令4.2 分布式锁示例4.3 脚本缓存总结一、事务基础1.1 事务特性┌─────────────────────────────────────────────────────────────┐ │ Redis 事务特性 │ ├─────────────────────────────────────────────────────────────┤ │ ✅ 批量操作多个命令打包执行 │ │ ✅ 顺序执行按入队顺序执行 │ │ ✅ 隔离性事务执行期间不被其他命令打断 │ │ ⚠️ 非原子性某命令失败不影响其他命令 │ └─────────────────────────────────────────────────────────────┘1.2 事务执行流程MULTI → 命令入队 → EXEC → 执行所有命令 │ │ └── DISCARD 取消 ───┘二、事务命令详解2.1 基本事务# 开始事务MULTI# 命令入队SET key1value1SET key2value2INCR counter# 执行事务EXEC# 返回每个命令的结果# 1) OK# 2) OK# 3) (integer) 12.2 取消事务MULTI SET key1value1SET key2value2# 取消事务DISCARD2.3 事务错误处理# 语法错误整个事务不执行MULTI SET key1value1INCR key1 key2# 语法错误EXEC# 返回错误所有命令都不执行# 运行时错误其他命令继续执行MULTI SET key1value1INCR key1# key1不是数字运行时错误SET key2value2EXEC# 1) OK# 2) (error) ERR value is not an integer# 3) OK三、WATCH 监控3.1 乐观锁机制# 监控键WATCH balance# 检查余额GET balance# 假设返回 100# 开始事务MULTI DECRBY balance50EXEC# 如果balance被其他客户端修改EXEC返回nil3.2 取消监控# 取消所有监控UNWATCH3.3 实战示例转账# 转账事务WATCH from_account to_account GET from_account GET to_account MULTI DECRBY from_account100INCRBY to_account100EXEC四、Lua 脚本4.1 EVAL 命令# 执行Lua脚本EVALreturn redis.call(GET, KEYS[1])1mykey# KEYS数组KEYS[1], KEYS[2]...# ARGV数组ARGV[1], ARGV[2]...4.2 分布式锁示例# 加锁脚本EVAL if redis.call(SETNX, KEYS[1], ARGV[1]) 1 then redis.call(EXPIRE, KEYS[1], ARGV[2]) return 1 else return 0 end 1lock:resource uuid30# 解锁脚本EVAL if redis.call(GET, KEYS[1]) ARGV[1] then return redis.call(DEL, KEYS[1]) else return 0 end 1lock:resource uuid4.3 脚本缓存# 加载脚本SCRIPT LOADreturn redis.call(GET, KEYS[1])# 返回SHA1: abc123...# 执行缓存的脚本EVALSHA abc123...1mykey# 检查脚本是否存在SCRIPT EXISTS abc123...# 清除所有脚本SCRIPT FLUSH总结本文我们学习了✅事务基础MULTI/EXEC/DISCARD✅WATCH 监控乐观锁机制✅Lua 脚本EVAL/EVALSHA✅分布式锁原子操作实现下篇预告Redis 从入门到精通十管道技术作者刘~浪地球系列Redis 从入门到精通九更新时间2026-04-06