有没有理由在redis中使用lua脚本来实现原子性,而不是使用multi/exec样式的事务?我看到一些实现在需要原子性的时候特别选择lua脚本,但是multi/exec不是也一样吗?或者这只是一种偏好?
jpfvwuh41#
当您需要将一个操作的结果用于另一个操作时,lua是有用的(也是唯一的方法)。当你使用 MULTI / EXEC ,则在事务结束时以数组形式获得结果。在事务处理过程中不会使用中间响应。假设你有一张单子 LPOP 一个元素,并将该元素名称用作 IBCRBY 其他一些。你不能在家里做 MULTI/EXEC (如果修改了被监视的密钥,则可以使用watch和它们一起失败)以事务方式。在开始事务之前,您需要给出/知道所有必需的参数。当你 assign 值,则它将不是服务器端,而是客户端,这可能会导致竞速情况。在lua中(使用eval),您可以执行以下任务
MULTI
EXEC
LPOP
IBCRBY
MULTI/EXEC
assign
local elt = redis.call('LPOP', KEYS[1]) local result = redis.call('INCRBY', elt, 2); return result
在某些情况下,“选择”它们中的任何一个都可能是一种选择,但在某些情况下,您需要lua。
1条答案
按热度按时间jpfvwuh41#
当您需要将一个操作的结果用于另一个操作时,lua是有用的(也是唯一的方法)。当你使用
MULTI
/EXEC
,则在事务结束时以数组形式获得结果。在事务处理过程中不会使用中间响应。假设你有一张单子
LPOP
一个元素,并将该元素名称用作IBCRBY
其他一些。你不能在家里做MULTI/EXEC
(如果修改了被监视的密钥,则可以使用watch和它们一起失败)以事务方式。在开始事务之前,您需要给出/知道所有必需的参数。当你assign
值,则它将不是服务器端,而是客户端,这可能会导致竞速情况。在lua中(使用eval),您可以执行以下任务
在某些情况下,“选择”它们中的任何一个都可能是一种选择,但在某些情况下,您需要lua。