删除Redis集群中的多个键

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

据我了解,redis群集中的插槽是分布式的,可以接多个键的DEL命令失败,并出现CROSSSLOT Keys in request don't hash to the same slot错误。

由于我现有的代码库是围绕批处理设计的,因此在很多地方,redis缓存删除操作被调用,并带有要删除的键列表。由于更改此名称不是一个聪明的主意我正在尝试在我的缓存接口层找到一个解决方案,在这里我仍然可以接收要删除的多个密钥,并在此处添加所需的逻辑以达到相同的最终结果。我认为有两个选项需要我的帮助

方法1。在按键上循环并使用Go例程+重量组

方法2。使用EVAL:我不确定这是正确的方向还是正确使用。以下是下面的示例golang代码段:>

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错误。

Am我在Lua脚本中以错误的方式使用了KEYS表。或者从集群中删除多个密钥的正确方法是什么。我应该坚持方法1吗?

使用Golang v1.13和redis.v5作为我的redis-client软件包。如果有人可以使用redis.v5软件包本身来帮助我找到解决方案,那将更好。

据我了解,redis集群中的插槽是分布式的,可以使用多个密钥的DEL命令失败,并且CROSSSLOT密钥在请求中不会散列到相同的插槽错误。由于我现有的...

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

针对您的问题的两种可能的解决方案是:

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