Redis Lua 函数调用失败并出现 CROSSSLOT 错误

问题描述 投票:0回答:1

我有一个 Redis 7.x 集群,有 3 个主节点在端口 7000、7001、7002 上运行。每个主节点有 1 个从/副本。

我正在尝试加载并运行这个基于 Lua 的函数:

#!lua name=paramsLogLib
local function paramsLog(keys, args)
    local param1 = keys[1]
    local param2 = keys[2]
    local param3 = keys[3]
    redis.log(redis.LOG_NOTICE, param1, param2, param3)
end
redis.register_function('paramsLog', paramsLog)

该功能已在3个主节点全部加载。

我尝试从所有 3 个主节点调用函数 paramsLog

127.0.0.1:7000> fcall paramsLog 3 p1 p2 p3

127.0.0.1:7001> fcall paramsLog 3 p1 p2 p3

127.0.0.1:7002> fcall paramsLog 3 p1 p2 p3

我遇到同样的错误:

(error) CROSSSLOT Keys in request don't hash to the same slot

如何将不同的参数传递给Redis中的任何函数?为什么Redis需要检查参数本身的哈希槽?

redis lua redis-cluster
1个回答
0
投票

因为Redis Cluster命令,包括Lua脚本,运行在单个节点上,它无法访问集群中其他节点上的密钥。如果您的命令/脚本需要访问不在同一插槽上的多个密钥,您会收到 CROSSSLOT 错误。

在您的情况下,您的 3 个键,即 p1、p2、p3,位于不同的插槽上(也可能位于不同的节点上),这就是您收到错误的原因。

正如 @Kevin 在评论中提到的,如果 p1、p2 和 p3 不是键,而是参数,您可以将它们作为参数传递,并使用

args
访问它们。如果它们确实是密钥,您可以尝试使用hash-tag来确保这些密钥位于同一个插槽上。这样您的脚本就可以访问所有这些。

© www.soinside.com 2019 - 2024. All rights reserved.