【问题标题】:Lua Scripts vs Multi/Exec in RedisRedis 中的 Lua 脚本与 Multi/Exec
【发布时间】:2020-11-08 05:48:03
【问题描述】:

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

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

【问题讨论】:

    标签: redis lua transactions atomic


    【解决方案1】:

    当您需要将一个操作的结果用于另一个操作时,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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 2021-04-01
      • 2020-08-25
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多