使用 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 实例,从而导致错误。您的标签应该相同,例如,您可以使用 userId
、recordId
等作为标签。
对于您的示例,如果您可以将地图更改为下方,它应该可以正常工作。
{
"demoKey_1:{demoKey}":"value1",
"demoKey_2:{demoKey}":"value2",
"demoKey_3:{demoKey}":"value3"
}
我在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 实例,从而导致错误。您的标签应该相同,例如,您可以使用 userId
、recordId
等作为标签。
对于您的示例,如果您可以将地图更改为下方,它应该可以正常工作。
{
"demoKey_1:{demoKey}":"value1",
"demoKey_2:{demoKey}":"value2",
"demoKey_3:{demoKey}":"value3"
}