我有Lua脚本,我正在考虑迁移到Redis Cluster
我应该在通话时指定完整的密钥名称eval吗?或者我可以通过指定主题标签逃脱?
例如,我想只传递{UNIQUE_HASH_TAG}代替{UNIQUE_HASH_TAG}/key1,{UNIQUE_HASH_TAG}/key2...等
我有很多键,逻辑非常复杂 - 有时我最终动态生成键名但在同一个哈希标记内.
我是否会通过传递哈希标签而不是密钥名称来违反某些规范?
我有一个由多个节点组成的redis集群.我想在单个原子操作中更新3个不同的键.我的Lua脚本如下:
local u1 = redis.call('incrby', KEYS[1], ARGV[1])
local u2 = redis.call('incrby', KEYS[2], ARGV[1])
local u3 = redis.call('incrby', KEYS[3], ARGV[1])
Run Code Online (Sandbox Code Playgroud)
我解雇了它:
EVAL script 3 key1 key2 key3 arg
Run Code Online (Sandbox Code Playgroud)
但是我得到了WARN Resp(AppErr CROSSSLOT Keys in request don't hash to the same slot).上述操作无法完成,更新将失败.我似乎无法使用单个Lua脚本修改不同节点中的键.但根据文件:
必须在执行前分析所有Redis命令,以确定命令将在哪些键上运行.为了使EVAL成为现实,必须明确传递密钥.这在许多方面都很有用,但尤其要确保Redis Cluster可以将您的请求转发到适当的群集节点.
请注意,此规则未强制执行,以便为用户提供滥用Redis单实例配置的机会,但代价是编写与Redis Cluster不兼容的脚本.
所以我认为只要遵循密钥传递规则,脚本就应该与redis集群兼容.我想知道这里的问题是什么,我应该怎么做才能更新单个脚本中的所有键.