【发布时间】:2020-11-08 05:48:03
【问题描述】:
是否有任何理由在 redis 中使用 lua 脚本来实现原子性,而不是使用 multi/exec 样式的事务?
我看到一些实现在需要原子性时专门选择 lua 脚本,但它与 multi/exec 不一样还是只是一种偏好?
【问题讨论】:
标签: redis lua transactions atomic
是否有任何理由在 redis 中使用 lua 脚本来实现原子性,而不是使用 multi/exec 样式的事务?
我看到一些实现在需要原子性时专门选择 lua 脚本,但它与 multi/exec 不一样还是只是一种偏好?
【问题讨论】:
标签: redis lua transactions atomic
当您需要将一个操作的结果用于另一个操作时,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。
【讨论】: