【问题标题】:How to properly pass composite key in Redis LUA script?如何在 Redis LUA 脚本中正确传递复合键?
【发布时间】:2022-02-21 22:07:53
【问题描述】:

我有 Redis 系统,它利用不同前缀的键嵌套和键组合:

SET prefix-1:concrete-key-1 value-1
SET prefix-1:concrete-key-2 value-2
SET prefix-2:concrete-key-1 value-3
SET prefix-2:concrete-key-2 value-4
SET id-123 concrete-key-1
SET id-456 concrete-key-2
SET id-789 concrete-key-1

所以通过使用 id-xxx<prefix> 我可以在 2 个命令中获得特定值

id-123 -> concrete-key-1
prefix-1 + concrete-key-1 -> value-1

为了减少 redis 调用和流量,我创建了小型 LUA 脚本来在 Redis 端执行 getter:

key = redis.call('GET', KEYS[1]);
return redis.call('GET', <prefix>..key);

问题是在这种情况下如何正确传递前缀?
根据 Redis,我应该明确地将键指定为 KEYS 参数:https://redis.io/topics/lua-api

我应该将它作为密钥传递吗?

key = redis.call('GET', KEYS[1]);
return redis.call('GET', KEYS[2]..key);

但是没有独立的&lt;prefix&gt;键,它们都是由&lt;prefix&gt;:&lt;key&gt;组成的。那么我应该将前缀作为参数传递吗?

key = redis.call('GET', KEYS[1]);
return redis.call('GET', ARGV[1]..key);

或者这样传递它是否有意义?还有其他方法如何使用脚本正确获取价值?

【问题讨论】:

    标签: redis lua


    【解决方案1】:

    声明KEYS 的目的是让Redis Cluster 可以将脚本路由到正确的服务器,如果您尝试引用驻留在不同服务器上的密钥,则可以快速失败。请参阅我的回答 here 了解更多详情。

    因此,您的第一步是考虑是否所有可能的组合键都将驻留在同一台服务器上。如果没有,您无论如何都无法运行您的脚本。

    如果是这样,那么您当前在 KEYS 参数中传递 id-123 键的方案就可以了。在KEYS 中传递前缀绝对没有意义,因为它不是一个前缀,Redis 不知道如何处理它。是硬编码还是传入ARGV 取决于您,就像您调用函数一样。

    【讨论】:

      猜你喜欢
      • 2020-11-18
      • 2018-01-05
      • 2017-05-23
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2020-09-29
      相关资源
      最近更新 更多