有没有办法让一个特定的key在集群模式下定位到一个特定的redis实例上?

Is there a way to make a specific key locate on a specific redis instance in cluster mode?

我想让我的多锁定位在不同的redis实例上。

我发现redission可以指定一个实例来执行命令,但是如果命令是键相关的,指定的实例会将命令传递给另一个实例。

你能给我一些建议吗?

可以,但这不是微不足道的。首先,Redis 在key 中使用花括号来确定它的sharding 部分,所以你可以决定修改一个key 并将它发送到任意一个shard。

现在,您需要两件事:

  1. 哪个分片或插槽范围位于哪个 redis 实例中的映射。

  2. 一种了解哪个字符串映射到哪个插槽的方法,因此您可以在密钥上强制使用 "sharding string" 将其路由到特定的分片。

第一个很简单 - CLUSTER SLOTS 会给你那张地图,只需解析它。

第二个更棘手 - 但幸运的是我已经完成了这项工作。我创建了一个 table 最短的字母数字字符串映射到 Redis 集群中的 16384 个槽中的每一个。我在 C 中,但您可以轻松地将其转换为任何形式。 https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

所以你的算法将是,给定一个密钥和一个所需的节点:

  1. 查看插槽映射并获取驻留在该节点上的插槽范围。

  2. Select 该节点范围内的一个插槽。

  3. 在分片 table 中查找该插槽的条目。

  4. 用大括号在键上打那个字符串。例如将 foo 转换为 foo{e4x}

就是这样!使用此密钥的任何命令都将路由到该分片。

它的伪python版本:

# Build this table from CLUSTER SLOTS or CLUSTER NODES
slots = {
   '127.0.0.1:7000': [(0, 1045),(2000,2100)]
   ...
 }

# Build this table from the C example:
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]

def retarget_key(key, node):
    ranges = slots[node] 

    sharding_key = shading_table[ranges[0][0]]
    return '%s{%s}' % (key, sharding_key)