【发布时间】:2020-04-19 04:55:05
【问题描述】:
据我了解,在 redis 集群中,插槽是分布式的,可以采用多个键的 DEL 命令失败并出现 CROSSSLOT Keys in request don't hash to the same slot 错误。
由于我现有的代码库是围绕批处理设计的,所以在很多地方都会调用 redis 缓存删除操作并使用要删除的键列表。因为改变这不是一个聪明的主意我试图在我的缓存接口层找到一个解决方案,在那里我仍然可以接收要删除的多个键并在此处添加所需的逻辑以实现相同的最终结果。 我认为有两个选项需要帮助
方法1.循环按键,使用围棋套路+权重组
方法 2. 使用 EVAL :我不确定这是否是正确的方向,或者我是否正确使用它。以下是下面的示例golang sn-p
func (c CacheClient) Del(ctx context.Context, keysToBeDeleted []string) error {
// _, err := c.client.Del(strings.Join(keysToBeDeleted, " ")).Result() // previously used when on single redis instance
_, err := c.client.Eval("return redis.call('DEL', KEYS[1])", keysToBeDeleted).Result()
if err != nil {
// handle error
}
return nil
}
我创建了一个虚拟集群并使用 redis-cli 来测试 eval 命令如下
redis> EVAL "redis.call('del', KEYS[1]) " 2 mykey1, mykey2
这也因CROSSSLOT Keys in request don't hash to the same slot 错误而失败。
我是否在 Lua 脚本中以错误的方式使用了 KEYS 表。或者从集群中删除多个键的正确方法是什么。我应该坚持方法1吗?
使用 Golang v1.13 和 redis.v5 作为我的 redis-client 包。 如果有人可以帮助我找到使用 redis.v5 包本身的解决方案,那就太好了。
【问题讨论】:
-
这能回答你的问题吗? Redis Cross Slot error
-
部分是。帮助我理解 Lua 在这里不会有帮助。但我仍然想在这里了解可能的选择。最好是哈希标签或限制哈希槽的键
-
@rajat 您可能要考虑使用 RedisGears,它允许您运行跨槽/分片操作
标签: go redis redis-cluster