一尘不染

有没有一种方法可以使特定密钥在集群模式下位于特定Redis实例上?

redis

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

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

你能给我一些建议吗?


阅读 280

收藏
2020-06-20

共1个答案

一尘不染

您可以,但并非不重要。首先,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)
2020-06-20