Lua 脚本与 Redis 中的 Multi/Exec

Lua Scripts vs Multi/Exec in Redis

是否有任何理由在 redis 中使用 lua 脚本来实现原子性而不是使用 multi/exec 样式事务?

我看到一些实现在需要原子性时专门选择 lua 脚本,但它与 multi/exec 不一样还是只是一种偏好?

LUA 当您需要将一个操作的结果用于另一个操作时很有用(也是唯一的方法)。当您使用 MULTI/EXEC 时,您会在事务结束时以数组形式获得结果。在事务中间不会有中间响应使用。

假设您有一个列表,您 LPOP 一个元素并将该元素名称用作 INCRBY 其他元素的键。您不能以事务方式在 MULTI/EXEC 中执行此操作(如果修改了监视的密钥,您可以将 WATCH 与它们一起使用以失败)。在开始交易之前,您需要 give/know 所有必需的参数。当您 assign 值时,它将不是服务器端,而是客户端,这可能会导致竞争情况。

在LUA(with EVAL)中,你可以做这样的赋值,比如

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

return result 

在某些情况下,“选择”其中任何一个都是一种选择,但在某些情况下,您需要 LUA。