我的计划是将一些现有的Redis密钥存储在哈希中,稍后将从Redis Lua脚本中获取并执行操作。我读到最佳做法是在调用EVAL
时提供脚本中使用的所有密钥。
我的问题是,在运行EVAL
时运行没有提供任何密钥的脚本是否安全,但是对某些从 脚本中提取的密钥进行操作?如果没有,后果是什么,我该如何避免这个缺点?
我提到在EVAL
时,无法知道特定哈希中的键是什么。我可以在EVAL
之前的一个步骤中从哈希中获取所有键,然后将它们提供给EVAL
,但这听起来有点矫枉过正。
答案 0 :(得分:1)
由于文档含糊不清,这个问题会被问到很多(例如,请参阅this和this),但我会利用这个机会尝试指定实际的规则来管理在Redis脚本中使用密钥。
实际规则是:您的脚本必须只能访问驻留在单个服务器上的密钥,Redis必须知道该服务器是什么,以便它可以在那里路由脚本。
如果您不使用Redis群集,则始终会满足这些条件,因为只有一台服务器。
如果您使用的是Redis群集,则必须至少指定一个密钥,并且该脚本使用的所有密钥必须与指定密钥位于同一服务器上。
所以回答你的问题:如果你不使用Cluster,你的脚本将正常工作。结果是,如果您以后切换到Cluster,它将无法工作,因为Redis不知道将脚本发送到何处。
Redis也可能会更改为强制执行记录的规则,从而使动态生成密钥的所有脚本无效。在我看来,这将是一个错误的错误,我不认为它会发生。但是指定密钥作为文档是有用的,如果没有其他的话,所以如果我事先知道密钥,我总是这样做。