【问题标题】:Query multiple keys in Redis in Cluster modeRedis集群模式下查询多个key
【发布时间】:2018-05-05 06:26:39
【问题描述】:

我在集群模式下使用 Redis(6 个节点,3 个主节点和 3 个从节点)并且我使用的是 SE.Redis,但是,不支持像往常一样在不同哈希槽中具有多个键的命令

所以我使用 HashTags 来确保某个键属于使用 {} 的特定哈希槽。例如,我有 2 个键,例如 cacheItem:{1}cacheItem:{94770}

我使用(每个键在一个单独的请求中)设置这些键:

SEclient.Database.StringSet(key,value)

这很好用,

但是现在我想查询属于多个哈希槽的key1和key2

SEclient.Database.StringGet(redisKeys);

上面会失败并抛出异常,因为这些键属于多个哈希槽

在查询键时,我无法确定我的键是否属于同一个哈希槽, 这个例子只有 2 个键,我有数百个要查询的键。

所以我有以下问题:

当多个键属于不同的哈希槽时,如何查询它们? 这样做的最佳做法是什么?

我应该计算我这边的哈希槽,然后为每个哈希槽发送单独的请求吗?

我可以在我的场景中使用 TwemProxy 吗?

非常感谢任何帮助

【问题讨论】:

    标签: redis stackexchange.redis redis-cluster


    【解决方案1】:

    我无法与 SE.Redis 交谈,但您的方向是正确的。您需要:

    • 为每个密钥发出单独的请求,以确保它们到达正确的集群节点,或者...
    • 预先计算每个密钥所属的分片+服务器,按主机分组。然后将带有这些密钥的 MGET 请求发送到拥有它们的每个主机

    预先计算将要求您(或您的客户)预先了解集群拓扑(哈希槽所有者)和 Redis 密钥哈希方法(不用担心,它很简单且有据可查)。

    • 您可以从 Redis 查询集群信息以获取拥有的插槽。
    • 基本的散列算法是HASH_SLOT=CRC16 (key) mod 16384。四处搜索,您可以找到任何语言的代码?请记住,使用哈希标签会使这变得更加复杂!另请参阅:https://redis.io/commands/cluster-keyslot

    一些 Redis 集群客户端会通过内部魔法为您做到这一点(例如 Java 中的生菜),但它们并非都是平等的 ?

    还要注意集群拓扑基本上随时可以变化,上面的工作比较复杂。为了持久,如果遇到跨槽错误,您将需要重试。或者您可以对单个键发出许多请求,因为它更易于维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 2021-09-16
      • 2019-03-07
      • 2022-11-26
      • 1970-01-01
      • 2016-09-20
      • 2015-08-15
      • 2018-09-09
      相关资源
      最近更新 更多