跳转至

Redis 支持事务吗?Lua 脚本

一、Redis 事务

MULTI/EXEC:

MULTI
SET k1 v1
SET k2 v2
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。