我正在评估在redis中使用lua scrips,它们似乎有点慢。我的基准如下:
SET key_i val_i
1M次EVAL "SET KEYS[1] ARGV[1]" 1 key_i val_i
在我的笔记本电脑上测试,lua版本比非lua版本慢约3倍。我知道lua是一种脚本语言,没有编译等等,但这似乎是很多性能开销 - 这是正常的吗?
假设这确实正常,有没有解决办法?有没有办法用更快的语言实现脚本,例如C(写入redis)以获得更好的性能?
编辑:我正在使用位于此处的go代码对此进行测试:https://gist.github.com/ortutay/6c4a02dee0325a608941
答案 0 :(得分: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
将它放在Go字符串中,然后将其传递给相应的调用,没有键参数和一个非循环参数,即循环的次数。
答案 1 :(得分:0)
因此,现在有了使用John Sully创建的模块的解决方法。它适用于Redis和KeyDB,并允许您使用V8 JIT引擎,该引擎运行复杂脚本的速度比Lua脚本快得多。 https://github.com/JohnSully/ModJS