您是否必须提前在Redis脚本中声明您的密钥?

时间:2018-05-19 16:25:30

标签: lua redis

我的计划是将一些现有的Redis密钥存储在哈希中,稍后将从Redis Lua脚本中获取并执行操作。我读到最佳做法是在调用EVAL时提供脚本中使用的所有密钥。

我的问题是,在运行EVAL时运行没有提供任何密钥的脚本是否安全,但是对某些从 脚本中提取的密钥进行操作?如果没有,后果是什么,我该如何避免这个缺点?

我提到在EVAL时,无法知道特定哈希中的键是什么。我可以在EVAL之前的一个步骤中从哈希中获取所有键,然后将它们提供给EVAL,但这听起来有点矫枉过正。

1 个答案:

答案 0 :(得分:1)

由于文档含糊不清,这个问题会被问到很多(例如,请参阅thisthis),但我会利用这个机会尝试指定实际的规则来管理在Redis脚本中使用密钥。

实际规则是:您的脚本必须只能访问驻留在单个服务器上的密钥,Redis必须知道该服务器是什么,以便它可以在那里路由脚本。

如果您不使用Redis群集,则始终会满足这些条件,因为只有一台服务器。

如果您使用的是Redis群集,则必须至少指定一个密钥,并且该脚本使用的所有密钥必须与指定密钥位于同一服务器上。

所以回答你的问题:如果你不使用Cluster,你的脚本将正常工作。结果是,如果您以后切换到Cluster,它将无法工作,因为Redis不知道将脚本发送到何处。

Redis也可能会更改为强制执行记录的规则,从而使动态生成密钥的所有脚本无效。在我看来,这将是一个错误的错误,我不认为它会发生。但是指定密钥作为文档是有用的,如果没有其他的话,所以如果我事先知道密钥,我总是这样做。