你能读取Redis Lua脚本中未明确指定的键吗?

这里有一个示例场景来说明:

假设我们有一些键值对:

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 脚本时“things”列表的 lrange 调用将返回哪些键。在一个 Lua 脚本中以这种方式访问数据是否违反了为 Redis 集群规划未来保障的规则?

我对 Redis 还很新,对 Lua 则毫不知情,所以如果我的目标完全没有根据,请告诉我。另外,我对多次往返旅行的主要关注点是网络 io,特别是在水平扩展集群中。因此,完全不同的解决方案也将受到欢迎。

点赞
用户194389
用户194389

EVAL 文档中:

之所以需要正确传递键是因为在执行 EVAL 之前,所有 Redis 命令都可以在执行之前进行分析,以便确定命令将要操作的键。

为了让 EVAL 也满足这一点,键也必须是显式的。这对于许多方面都很有用,尤其是为了确保 Redis 集群能够将您的请求转发到适当的群集节点(Redis 集群还在努力中,但是脚本功能被设计为与之兼容)。然而,这条规则并不是为了强制执行,而是为了为用户提供滥用 Redis 单个实例配置的机会,代价是编写与 Redis 集群不兼容的脚本。

2013-05-17 04:06:31