Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 对于eval,密钥名是不预先知道的_Redis - Fatal编程技术网

Redis 对于eval,密钥名是不预先知道的

Redis 对于eval,密钥名是不预先知道的,redis,Redis,Redis文档建议我将键名指定为脚本的参数,并在脚本中读取它们,而不是在脚本中硬编码它们。如果我在调用脚本时知道这些名称,那么这样做很好 在我的例子中,我的密钥名存储在Redis对象(散列)中,我需要根据参数检索一些散列条目,然后以原子方式访问这些密钥 有人对如何使其以兼容的方式工作有任何想法吗?您的原子访问是否需要在从散列中读取密钥名的过程中产生,还是只有在您读取了密钥名并准备进一步使用它之后才需要 如果您需要它,那么使用Lua脚本从散列中读取键名,将其存储在变量中,然后在根据该键名获取数据时

Redis文档建议我将键名指定为脚本的参数,并在脚本中读取它们,而不是在脚本中硬编码它们。如果我在调用脚本时知道这些名称,那么这样做很好

在我的例子中,我的密钥名存储在Redis对象(散列)中,我需要根据参数检索一些散列条目,然后以原子方式访问这些密钥


有人对如何使其以兼容的方式工作有任何想法吗?

您的原子访问是否需要在从散列中读取密钥名的过程中产生,还是只有在您读取了密钥名并准备进一步使用它之后才需要


如果您需要它,那么使用Lua脚本从散列中读取键名,将其存储在变量中,然后在根据该键名获取数据时进一步使用它。如果第二部分只需要原子性,请首先读取键名,然后将其用作参数,正如Redis文档对第二部分所建议的那样。

我也遇到了同样的问题。正如您所提到的,文档说明:

脚本使用的所有键都应该使用这些键传递 数组,按以下方式:

评估“返回redis.call('set',key,'bar')”1 foo OK

以正确的方式传递密钥的原因是,在评估所有 可以在执行之前分析Redis命令,以便 确定命令将在哪些键上操作

但在同一份文件的后面部分,写的是:

为了使EVAL的结果为真,键也必须是显式的。这 在许多方面都很有用,但特别是为了确保Redis 群集能够将您的请求转发到相应的群集 节点(Redis群集)正在开发中,但脚本功能 是为了更好地使用它而设计的)。然而,这一规则并非如此 强制执行,以便为用户提供滥用 Redis单实例配置,以编写脚本为代价 与Redis群集不兼容


总之,以正确的方式传递密钥在您使用Redis Cluster时是相关的,因此Redis群集机制知道您操作的是什么数据,并且由于它,它知道您的数据在哪里


当您不想使用Redis Cluster或在中实现群集时,以正确的方式传递密钥不是强制性的。

谢谢。我需要它全是原子的。是的,当然我知道我需要从散列中读取密钥名,然后使用它们。问题是
EVAL
不知道脚本将使用什么键名,因此无法安排在集群中的正确节点上对脚本求值。并不是说我在使用集群,但这个问题在这一点上是相当理论化的。