优化 Redis Lua 脚本调用到 redis.call

根据这份 Lua 优化文档:https://www.lua.org/gems/sample.pdf

访问外部局部变量(即在封装函数内的变量)并不像访问局部变量那样快,但访问速度仍然比全局变量快。考虑下一个片段:

function foo (x)
  for i = 1, 1000000 do
    x = x + math.sin(i)
  end
  return x
end
print(foo(10))

我们可以通过在函数 foo 外声明一次 sin 来进行优化:local

sin = math.sin
function foo (x)
  for i = 1, 1000000 do
    x = x + sin(i)
  end
  return x
end
print(foo(10))

redis.call 是一个全局变量吗?我们能通过声明指向它的局部变量来进行优化吗?特别是对于频繁调用 redis.call 的紧密循环。

另外,KEYSARGV 是否也是全局变量?

点赞
用户654928
用户654928

所以以下三个 Redis 命令都成功执行。

  1. eval "return _G.redis.call('set', 'x', 1)" 0

  2. eval "return _G.KEYS" 1 1

  3. eval "return _G.ARGV" 0 1

所以我猜它们都是全局变量,请有人纠正我如果我错了...

2021-01-10 23:51:17
用户5384363
用户5384363

redis.call是全局的吗?

跟进一下,KEYSARGV也是全局的吗?

是的,redisKEYSARGV都是全局的。

我们可以通过声明指向它的局部变量来优化它吗?尤其是在多次调用redis.call的紧凑循环中。

根据您的参考,似乎您可以使用局部变量优化Lua代码。不过,通常情况下,您不应该在Lua脚本中执行过多操作,例如运行大型循环并执行许多Redis命令。因为Redis是单线程的,如果Lua脚本花费太多时间,它将阻塞Redis。

通常,我喜欢将KEYSARGV数组中的元素分配给局部变量。这不是为了效率,而是为了代码清晰度。

2021-01-11 01:24:18