事务和 Lua 脚本
Redis 的事务和 MySQL 事务不是一回事。
Redis 事务可以把多个命令排队,然后一次执行。它保证执行期间不会插入其他客户端命令,但不提供 SQL 那种自动回滚能力。
一、MULTI 和 EXEC
事务从 MULTI 开始:
执行流程:
取消事务:
二、事务没有自动回滚
示例:
INCR count 会因为 value 不是整数而失败,但 SET name Tom 仍然可能执行。
所以 Redis 事务不能按 MySQL 的回滚思路理解。
三、WATCH 乐观锁
WATCH 用来监视 key。如果事务执行前 key 被其他客户端修改,EXEC 会失败。
客户端 A:
客户端 B 在 A 执行 EXEC 前修改:
此时客户端 A 的 EXEC 会返回空结果,表示事务没有执行。
常见用途:
实际项目里通常由客户端库封装重试逻辑。
四、Lua 脚本
Redis 可以执行 Lua 脚本。脚本执行期间是原子的,中途不会被其他命令插入。
基本格式:
含义:
五、分布式锁释放脚本
加锁:
释放锁时必须先判断 value 是否属于当前请求,再删除 key。
Lua 脚本:
逻辑:
这样可以避免误删其他请求后来创建的锁。
六、Lua 使用注意
Lua 适合封装“检查再修改”的原子逻辑,例如限流、扣库存、释放锁。

