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

标签 lua redis

我正在评估在redis中使用lua scrips,他们似乎有点慢。我的基准如下:

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

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

假设这确实是正常的,是否有任何解决方法?有没有办法用更快的语言实现脚本,比如 C(redis 就是用它写的)来实现更好的性能?

编辑:我正在使用位于此处的 go 代码对此进行测试:https://gist.github.com/ortutay/6c4a02dee0325a608941

最佳答案

问题不在于 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 字符串中,然后将其传递给适当的调用,没有键参数和一个非键参数,即循环次数。

关于lua - 为什么lua在redis中这么慢?任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36144241/

相关文章:

text - Lua 匹配错误的模式

c++ - 把lua脚本转换成等价的指令(opcode)呢?

ajax - 使用 Nginx Lua POST 请求表单数据操作

c# - 如何处理 Redis 哈希的强类型?

java - 使用 spring boot 处理 redis 缓存可用性

带有字符串键的 Lua 表不能使用数字索引?

lua - 跨架构luac输出

python - flask 缓存 : list keys based on a pattern?

ruby-on-rails - 如何使用 config.cache_store = :redis_store? 按环境命名缓存

node.js - Nodejs Redis HSET & HGET 插入到数据集错误