你可以,但这并不是微不足道的。首先,Redis 在键中使用大括号来确定其分片部分,因此您可以决定修改键并将其发送到任意分片。
现在,您需要两件事:
哪个分片或槽范围驻留在哪个 Redis 实例中的映射。
一种了解哪个字符串映射到哪个插槽的方法,因此您可以在密钥上强制使用“分片字符串”以将其路由到特定分片。
第一个很简单——CLUSTER SLOTS
会给你那张地图,只需解析它即可。
第二个更棘手 - 但幸运的是我已经完成了这项工作。我创建了一个表,其中包含映射到 Redis 集群中每个 16384 个槽的最短可能的字母数字字符串。我用的是 C 语言,但你可以轻松地将其转换为任何语言。https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
因此,给定一个密钥和一个所需的节点,您的算法将是:
查看槽位图并获取驻留在该节点上的槽位范围。
选择该节点范围内的一个插槽。
在分片表中查找该插槽的条目。
将带有大括号的字符串放在键上。例如转变foo
to 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)