1

这是一个示例场景来说明:

假设我们有一些 key=>value 对:

hmset thing1 name 'a thing' color red
hmset thing2 name 'another thing' color green
hmset thing3 name 'also a thing' color blue

以及一个其值为键名的列表:

lpush things thing1
lpush things thing2
lpush things thing3

我的目标是使用间接从一系列事物中获取值:

thingsArray = lrange things 0 2
for each thing in thingsArray
  result.push(hmget thing name color)

但这样做的代价是额外的往返行程。我意识到这可以通过流水线在一定程度上得到缓解,但希望只需使用 Lua 脚本进行一次往返即可。所以像:

eval superAwesomeScript 1 things 0 2

问题是,当我调用 Lua 脚本时,我不知道“事物”列表上的 lrange 调用将返回哪些键。在 Lua 脚本中以这种方式访问​​数据是否违反了针对 Redis 集群的未来验证建议的规则?

我对 Redis 还很陌生,而且对 Lua 完全是个菜鸟,所以如果我的目标离我很远,请告诉我。此外,我对多次往返的主要关注是网络 io,尤其是在水平扩展的集群中。因此,完全不同的解决方案也将受到欢迎。

4

1 回答 1

2

来自EVAL文档:

以正确方式传递键的原因是,在 EVAL 之前,可以在执行之前分析所有 Redis 命令,以确定该命令将操作哪些键。

为了使 EVAL 成为真的,键也必须是显式的。这在很多方面都很有用,尤其是为了确保 Redis Cluster 能够将您的请求转发到适当的集群节点(Redis Cluster 正在进行中,但脚本功能的设计是为了很好地使用它) . 但是,此规则并未强制执行,以便为用户提供滥用 Redis 单实例配置的机会,代价是编写与 Redis 集群不兼容的脚本。

于 2013-05-17T04:06:31.477 回答