使用 lua 脚本缓存数据,但在访问集群节点中的非本地键时出现 RedisCommandExecutionException

Cache data with lua script, but getting RedisCommandExecutionException with accessing a non local key in a cluster node

我在springboot项目中使用lua脚本在redis集群中缓存了一个地图数据,例如:

{
    "demoKey:{1}":"value1",
    "demoKey:{2}":"value2",
    "demoKey:{3}":"value3"
}

lua 脚本如下:

local addMap = cjson.decode(ARGV[1]);

for fieldKey, fieldValue in pairs(addMap) do
    redis.call("SET", fieldKey, fieldValue);
end

JAVA 代码:

final DefaultRedisScript<?> redisScript = new DefaultRedisScript<>();
redisScript.setScriptSource(LUA_SCRIPT);
redisClient.execute(redisScript, new ArrayList<>(), JsonUtil.toString(addMap));

我已经在redis中设置了hash tag键,但是在运行程序中我仍然得到异常。

org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR Error running script (call to f_7cce57ffe5b0b94fa78680955c993e808ffa5f16):
 @user_script:7: @user_script: 7: Lua script attempted to access a non local key in a cluster node

感谢您的帮助。

LUA 脚本不允许我们访问不在 LUA 脚本为 运行.

的同一台 Redis 机器上的密钥

一种解决方案是标记 KEYS,以便它落在正确的 Redis 节点上,标记一个键意味着所有键都属于同一个 Redis 实例。

您似乎已使用 {1}{2}{3} 完成标记,但所有这些都可能散列到不同的 Redis 实例,从而导致错误。您的标签应该相同,例如,您可以使用 userIdrecordId 等作为标签。

对于您的示例,如果您可以将地图更改为下方,它应该可以正常工作。

{
    "demoKey_1:{demoKey}":"value1",
    "demoKey_2:{demoKey}":"value2",
    "demoKey_3:{demoKey}":"value3"
}