Redis文档建议我将键名指定为脚本的参数,并在脚本中读取它们,而不是在脚本中对它们进行硬编码。如果我在调用脚本时知道名称,这可以正常工作。
就我而言,我的密钥名称存储在Redis对象(哈希)中,我需要根据参数检索一些哈希条目,然后以原子方式访问这些密钥。
有没有人对如何使其以合规方式运作有任何想法?
答案 0 :(得分:1)
我遇到了同样的问题。正如您所提到的,Redis EVAL command文档告诉我们:
脚本使用的所有键都应该使用KEYS传递 数组,方式如下:
eval“return redis.call('set',KEYS 1,'bar')”1 foo OK
以正确的方式传递密钥 的原因是,在EVAL之前 可以在执行之前分析Redis命令 确定命令将在哪些键上运行。
但后来在同一文档中写道:
为了使EVAL成为现实,键也必须是显式的。这个 在很多方面很有用,但特别是为了确保Redis 群集能够将您的请求转发到适当的群集 node(Redis Cluster是一项正在进行的工作,但是脚本功能 的设计是为了与它配合好)。但是这个规则不是 强制执行,以便为用户提供滥用的机会 Redis单实例配置,代价是编写脚本 与Redis Cluster不兼容。
总而言之, 以正确方式传递密钥 与您使用Redis群集时相关,因此Redis群集机制知道您操作的数据并由此感谢,它知道你的数据在哪里。
当您不想使用Redis群集或在other way中实现群集时, 以正确方式传递密钥 不是强制性的。
答案 1 :(得分:0)
您的原子访问是否需要在从哈希读取您的密钥名称的操作中产生,或者只有在您读取了密钥名称并且即将进一步使用它之后才需要它?
如果您需要它,那么使用Lua脚本从散列中读取密钥名称,将其存储在变量中,然后在根据该密钥名称获取数据时进一步使用它。如果您只需要第二部分的原子性,请首先阅读密钥名称,然后将其用作Redis文档为第二部分建议的参数。