您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您可以,但并非不重要。首先,Redis在密钥中使用花括号来确定其分片部分,因此您可以决定修改密钥并将其发送给任意分片。

现在,您需要两件事:

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

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

一个很简单- CLUSTER SLOTS将为您提供该地图,只需对其进行解析即可。

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

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

查看插槽图,并获取该节点上的插槽范围。

选择该节点范围内的插槽。

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

用键上的花括号将字符串拍打。例如转换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)
其他 2022/1/1 18:13:37 有650人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶