【问题标题】:Can you read keys not explicitly specified in Redis Lua scripts?你能读取 Redis Lua 脚本中未明确指定的键吗?
【发布时间】:2013-05-03 03:21:59
【问题描述】:

下面是一个示例场景来说明:

假设我们有一些键=>值对:

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,尤其是在水平扩展的集群中。因此,完全不同的解决方案也将受到欢迎。

【问题讨论】:

    标签: database lua nosql redis cluster-computing


    【解决方案1】:

    来自EVAL docs:

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

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

    【讨论】:

    • 那么,这基本上是“否”吗?我已阅读文档(特别包括您在此处引用的部分)。多次往返使用该策略是否正常?我正在努力适应未来的 Redis Cluster 实施。
    • 除非你绝对需要集群功能,否则我说不用担心。
    猜你喜欢
    • 2014-09-25
    • 2021-08-30
    • 2020-12-10
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多