我有一个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>,我可以在两个命令中得到特定的值
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,我应该显式地指定键作为键参数:https://redis.io/topics/lua-api
我应该把它当作钥匙传递吗?
key = redis.call('GET', KEYS[1]);
return redis.call('GET', KEYS[2]..key);但是没有独立的<prefix>键,它们都是由<prefix>:<key>组成的。那么,我应该把前缀作为一个论点传递吗?
key = redis.call('GET', KEYS[1]);
return redis.call('GET', ARGV[1]..key);或者这样传下去是有意义的吗?是否有其他方法可以正确地使用脚本获得值?
发布于 2022-02-21 14:07:53
声明KEYS的目的是使Redis集群能够将脚本路由到正确的服务器,如果您试图引用驻留在不同服务器上的密钥,则会快速失败。有关更多细节,请参见我的答案here。
因此,您的第一步是考虑是否所有可能的键组合都驻留在同一台服务器上。否则,您将无法在任何情况下运行脚本。
如果是这样的话,那么您当前只在id-123参数中传递KEYS键的方案是可以的。在KEYS中传递前缀绝对没有意义,因为它不是前缀,Redis将不知道该如何处理它。是否将其硬编码或传递到ARGV中取决于您,就像调用函数时一样。
https://stackoverflow.com/questions/71203968
复制相似问题