Lua Scripts vs Multi/Exec in Redis

使用 Lua 脚本保证 Redis 中的原子性尽量好,但是使用 multi/exec 事务也可以实现原子性。我发现某些实现在需要保证原子性时会专门选择 Lua 脚本,但是 multi/exec 是否同样可行或只是个人喜好呢?

点赞
用户2188922
用户2188922

当你需要将一个操作的结果用作另一个操作的参数时,LUA很有用(也是唯一的方法)。当你使用MULTI/ EXEC时,你会得到在事务结束时返回的数组结果。在事务过程中不会有中间响应以供使用。

假设你有一个列表,你LPOP一个元素,然后将该元素名称用作INCRBY其他某个元素的键。你不能以事务方式在MULTI/EXEC中执行它(你可以使用WATCH来防止在观察期间该键被修改)。你需要在开始事务之前给出或了解所有必需的参数。当你assign该值时,它将不会在服务器端,而是在客户端端,这可能会导致竞争条件。

使用LUA(使用EVAL)可以执行该赋值操作,例如:

local elt = redis.call('LPOP', KEYS[1])
local result = redis.call('INCRBY', elt, 2);

return result

可能有一些情况下,“选择”任何一种方法都可以,但在一些情况下,你需要使用LUA。

2020-07-18 19:05:05