2013-08-03 77 views
2

Redis文档建议我将键名指定为脚本的参数,并在脚本中将其读取,而不是在脚本中对其进行硬编码。如果我在调用脚本时知道名字,这很好。提前未知键名是否为eval

在我的情况下,我的键名存储在Redis对象(哈希)中,我需要根据参数检索一些哈希项,然后以原子方式访问这些键。

有没有人有任何想法如何使其工作在兼容的方式?

回答

0

您的原子访问是否需要在散列中读取您的密钥名称的操作中生成,或者只有在您读取了密钥名称并且将要使用它之后才需要?

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

+0

谢谢。我需要它全身而退。是的,当然我明白我需要从哈希中读取我的密钥名称,然后使用它们。问题是'EVAL'不知道我的脚本将使用什么键名,因此无法安排脚本在群集中的正确节点上进行评估。并不是说我正在使用一个集群,但这个问题在这一点上是相当理论化的。 – akonsu

1

我面临同样的问题。至于你提到的Redis EVAL command文档讲述:

脚本使用,应当使用按键 阵列传递的所有键,以下列方式:

EVAL“返回redis.call(“设置”,KEYS 1, '酒吧')” 1个foo的OK

在适当的方式之所以通过按键是,是在EVAL全部 之前,可以在执行之前分析Redis命令,以便 确定命令将操作的密钥。

但同样的文档中后来写的是:

为了使这是真的为EVAL还密钥必须是明确的。此 在许多方面很有用,但特别是为了确保Redis 群集能够将您的请求转发到适当的群集 节点(Redis群集正在进行中,但脚本功能 是为了播放而设计的以及它)。但是,此规则不是 强制执行的,以便为用户提供滥用Redis单实例配置的机会,代价是编写与Redis群集不兼容的脚本 。


所以总结起来,传递键在适当的方式是相关的,当您使用Redis的集群,所以Redis的集群机制知道你在操作什么数据和感谢它,它知道在哪里是你的数据。

如果你不想使用Redis的集群或你other way在适当的方式不是强制实现集群则传球键。