我想让我的多锁位于不同的Redis实例上。
我发现redission可以指定要在其上执行命令的实例,但是如果命令与键相关,则指定的实例会将命令传输到另一个实例。
你能给我一些建议吗?
您可以,但并非不重要。首先,Redis在密钥中使用花括号来确定其分片部分,因此您可以决定修改密钥并将其发送给任意分片。
现在,您需要两件事:
哪个碎片或插槽范围位于redis实例中的映射。
一种知道哪个字符串映射到哪个插槽的方法,因此您可以在密钥上强制使用“分片字符串”将其路由到特定的分片。
第一个很简单- CLUSTER SLOTS将为您提供该地图,只需对其进行解析即可。
CLUSTER SLOTS
第二个比较棘手- 但幸运的是我已经完成了这项工作。我创建了一个表,该表将最短的字母数字字符串映射到Redis集群中的每个16384插槽。我用C语言编写,但您可以轻松地将其转换为任何内容。https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
因此,给定密钥和所需的节点,您的算法将是:
查看插槽图,并获取该节点上的插槽范围。
选择该节点范围内的插槽。
在分片表中查找该插槽的条目。
用键上的花括号将字符串拍打。例如转换foo为foo{e4x}。
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)