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