Redis的Lua脚本中能否进行管道操作?

3

例如

我有几个set命令,我不关心它们的返回值,在我的lua脚本中,我必须写几个redis.call('set', key, val)

是否有类似管道的方式,可以将它们一起执行。也许更有效率?


每当你想要将某个东西变得“更高效”时,首先确保以下两点:一开始是否存在性能问题?我能否在改动之前和之后有效地衡量性能?如果无法肯定回答这两个问题为“是”,那么优化的努力就是徒劳的。 - ereOn
2个回答

6

不可以使用 Lua 脚本来批量执行 Redis 命令,也不能对命令进行流水线处理。需要注意的是,使用 redis.call 函数调用 Redis 命令非常高效,因此您无需过于担心这个问题。

正如 @deltheil 所指出的那样,如果您使用 Redis 命令的可变参数形式,则可以“分组”多个对同一命令的调用。虽然这对于 Lua 脚本不是很重要,但这绝对是推荐的做法。


3
虽然这个回答正确,但它忽略了一个重要的点:你不能从LUA脚本中进行管道操作,因为这没有任何意义。Redis LUA脚本的执行是原子性的,而且由于Redis是单线程的,因此在脚本执行期间无法执行其他Redis命令,使得在LUA脚本中需要使用管道的任何需求都是多余和无用的。 - ereOn
我认为redis.call肯定会引入一些开销,所以将多个调用合并成一个应该能提高性能。 - Jerry Chin
没错,但是Redis中redis.call的实现方式(即使用一个虚拟客户端)使得支持流水线处理变得不可能...无论如何,Lua/redis.call的开销令人惊讶地微不足道。 - Itamar Haber

5
使用 MSET 呢? 关于IT技术的内容。
$ redis-cli 
127.0.0.1:6379> eval 'redis.call("mset", "foo", "bar", "scm", "git", "test", "ok")' 0
(nil)
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> get scm
"git"
127.0.0.1:6379> get test
"ok"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接