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

lin*_*ndy 2 lua redis

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

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

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

Kev*_*nry 9

由于文档中的含糊性,这个问题经常被问到(例如,参见thisthis ),但我将利​​用这个机会尝试指定管理 Redis 脚本中键的使用的实际规则。

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

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

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

因此,回答您的问题:如果您不使用集群,您的脚本将正常工作。后果是如果你以后切换到 Cluster,它就无法工作,因为 Redis 不知道将脚本发送到哪里。

Redis 也有可能会更改为强制执行记录的规则,从而使所有动态生成密钥的脚本无效。我认为这种情况不太可能发生。但是指定密钥作为文档很有用,如果没有别的,所以如果我碰巧提前知道密钥,我总是这样做。