我想让我的多个锁定位在不同的redis实例上。
我发现redission可以指定要执行命令的实例,但是如果命令与键相关,则指定的实例将将命令传输到另一个实例。
你能给我一些建议吗?
发布于 2017-09-19 00:29:17
你可以,但这可不是小事。首先,Redis在键中使用大括号来确定其中的切分部分,因此您可以决定修改密钥并将其发送到任意的碎片。
现在,你需要两件事:
第一个是简单的-- CLUSTER SLOTS
会给出映射,只需解析它。
第二个更棘手--但幸运的是,我已经完成了这项工作。我已经创建了一个表,将尽可能最短的字母数字字符串映射到Redis集群中的16384个插槽中。我是用C语言写的,但是你可以很容易地把它转换成任何东西。https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
因此,给定一个密钥和一个所需的节点,您的算法将是:
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)
https://stackoverflow.com/questions/46294925
复制相似问题