eval不提前知道关键名称

时间:2013-08-03 03:04:29

标签: redis

Redis文档建议我将键名指定为脚本的参数,并在脚本中读取它们,而不是在脚本中对它们进行硬编码。如果我在调用脚本时知道名称,这可以正常工作。

就我而言,我的密钥名称存储在Redis对象(哈希)中,我需要根据参数检索一些哈希条目,然后以原子方式访问这些密钥。

有没有人对如何使其以合规方式运作有任何想法?

2 个答案:

答案 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文档为第二部分建议的参数。