【问题标题】:Do you have to declare your keys in advance in a Redis script?您是否必须提前在 Redis 脚本中声明您的密钥?
【发布时间】:2022-02-21 22:04:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    由于文档中的模棱两可,这个问题被问了很多(例如,参见thisthis),但我将利​​用这个机会来尝试指定管理密钥使用的实际规则Redis 脚本。

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

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

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

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

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

    【讨论】:

    • 感谢您的详细解答!但是,我正在构建一个库,并且我有兴趣使其尽可能便携。有没有办法解决这个问题?我在问题中提到的解决方案可能有效,但如果不是所有需要的密钥都在同一台服务器上会发生什么?
    • @linkyndy:你无法用 Redis 脚本实现你想要的。无法回避这样一个事实,即具有原子性保证的脚本只能在单个服务器上运行并操作驻留在单个服务器中的键。
    • 我明白了。那么,如果我愿意向脚本提供两个我知道它们驻留在两个不同服务器上的密钥,会发生什么?
    • @linkyndy:我不知道从个人经验,但this question 给出了一个这样做的例子以及随后的错误消息。
    • “如果我愿意向脚本提供两个我知道它们驻留在两个不同服务器上的密钥会发生什么?” CROSSSLOT 错误。
    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 2019-01-19
    • 2023-02-22
    • 2012-09-08
    • 2013-04-27
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多