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

Jac*_*ack 2 cluster-computing redis

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

我发现redission可以指定一个实例来执行命令,但是如果该命令与key相关,则指定的实例会将命令传输到另一个实例。

你能给我一些建议吗?

Not*_*fer 6

你可以,但这并不是微不足道的。首先,Redis 在键中使用大括号来确定其分片部分,因此您可以决定修改键并将其发送到任意分片。

现在,您需要两件事:

  1. 哪个分片或槽范围驻留在哪个 Redis 实例中的映射。

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

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

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

因此,给定一个密钥和一个所需的节点,您的算法将是:

  1. 查看槽位图并获取驻留在该节点上的槽位范围。

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

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

  4. 将带有大括号的字符串放在键上。例如转换foofoo{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)
Run Code Online (Sandbox Code Playgroud)