为什么lua在redis中这么慢?任何解决方法?

Sam*_*Lee 1 lua redis

我正在评估在redis中使用lua scrips,它们看起来有点慢.我的基准如下:

  1. 对于非lua版本,我做了一次简单的SET key_i val_i1M次
  2. 对于lua版本,我做了同样的事情,但是在一个脚本中:EVAL "SET KEYS[1] ARGV[1]" 1 key_i val_i

在我的笔记本电脑上测试,lua版本比非lua版本慢约3倍.我知道lua是一种脚本语言,没有编译等等,但这似乎是很多性能开销 - 这是正常的吗?

假设这确实正常,有没有解决办法?有没有办法用更快的语言实现脚本,例如C(写入redis)以获得更好的性能?

编辑:我正在使用这里的代码测试:https://gist.github.com/ortutay/6c4a02dee0325a608941

Nic*_*las 5

问题不在于Lua或Redis; 这符合你的期望.您正在编写脚本100万次.没有理由期望这很快.

Redis中EVAL的目的不是执行单个命令; 你可以自己做.目的是在Redis本身内,在服务器上而不是在本地客户端上执行复杂的逻辑.也就是说,不是每EVAL执行一次设置操作,而是在单个EVAL脚本中实际执行100万个集合的整个系列,这将由Redis服务器本身执行.

我对Go不太了解,所以我无法编写调用它的语法.但我知道Lua脚本会是什么样子:

for i = 1, ARGV[1] do
  local key = "key:" .. tostring(i)
  redis.call('SET', key, i)
end
Run Code Online (Sandbox Code Playgroud)

将它放在Go字符串中,然后将其传递给适当的调用,没有键参数和一个非循环参数,即循环的次数.

  • Redis 只编译脚本一次,因为编译的版本会被缓存,但如果您想运行大型脚本,那么使用 EVALSHA 来节省带宽可能是明智的选择。 (2认同)