Redis 支持事务吗?Lua 脚本¶
一、Redis 事务¶
MULTI/EXEC:
特点¶
- 命令顺序执行。
- 不回滚:中间失败其他继续。
- 不是真正的 ACID。
二、为什么不回滚¶
Redis 作者认为: - 错误都是编程错误,不该在运行时回滚。 - 保证简单。
三、Lua 脚本¶
Redis 可以执行 Lua 脚本,原子执行:
local v = redis.call('GET', KEYS[1])
if v == false then
redis.call('SET', KEYS[1], 1)
else
redis.call('INCR', KEYS[1])
end
为什么原子¶
整个脚本执行期间,Redis 不执行其他命令。
四、Lua vs 事务¶
- Lua:逻辑更复杂,原子执行。
- 事务:简单,但中间失败不回滚。
五、应用¶
- 分布式锁解锁(校验 value)。
- 库存扣减(原子)。
- 限流。
六、EVALSHA¶
脚本缓存,减少传输。
一句话
Redis 事务不回滚,复杂原子操作用 Lua。