为什么在调用Redis Lua脚本时会有KEYS和ARGV数组?

36

在Redis中调用Lua脚本时,可以通过两个数组KEYS和ARGV传递值。它们有什么区别?Redis如何处理KEYS数组中的值?如果我在脚本中需要使用运行时动态生成的键会怎样?

1个回答

38
你的所有问题都可以在EVAL页面得到解答,但是既然你问了...:

有什么区别?

KEYS用于传递键名,而ARGS应该用于其他任何内容。这并不是严格执行的(即大多数情况下混合使用也可以),但如果不遵循可能会导致潜在的问题。

Redis如何处理KEYS数组中的值?

检查KEYS的内容以验证所有键是否对正在运行脚本的Redis分片可用。此机制存在是为了允许在Redis集群部署中运行脚本。

如果我的脚本需要在运行时动态生成键怎么办?

请参见之前的答案-这是可行的,但你会违反建议。你的脚本只能在独立的Redis实例上安全运行,并且由于此行为未指定,它可能会在未来的版本中发生更改。


你有没有想过如何处理多个键,这些键将用于类似于 SORT mySet BY myHash:*->order GET myHash:*->name 的 SORT 命令中?我能传递 myHash:* 或类似的东西吗? - Schovi
@Schovi 这似乎与此问题和答案无关 - 请查看 Stack Overflow 上的现有问题或发布新问题。 - Itamar Haber
请问您能否详细解释一下“检查KEYS以验证所有键是否可用于运行脚本的Redis分片在Redis集群中”这句话的含义,或者提供一些链接来说明当我们将ARGV值本身用作键时会发生什么?在集群环境中动态创建键的缺点是什么?我更担心的是“它可能在未来的版本中被破坏”的声明。请帮忙解答。 - Kanagavelu Sugumar
KEYS机制确保脚本可以在集群中的特定分片上运行。如果在KEYS中的键没有散列到执行分片的任何一个插槽中,则会引发CROSSSLOT错误。 - Itamar Haber
3
你的脚本只能在单独的 Redis 实例上运行才是安全的。由于这种行为未被规定,它可能会在未来的版本中出现问题,这似乎严重限制了 Lua 脚本的使用价值。 - Qix - MONICA WAS MISTREATED

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