首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有一种方法可以在集群模式下对特定的redis实例进行特定的键定位?

是否有一种方法可以在集群模式下对特定的redis实例进行特定的键定位?
EN

Stack Overflow用户
提问于 2017-09-19 07:53:19
回答 1查看 1.6K关注 0票数 2

我想让我的多个锁定位在不同的redis实例上。

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

你能给我一些建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-19 08:29:17

你可以,但这可不是小事。首先,Redis在键中使用大括号来确定其中的切分部分,因此您可以决定修改密钥并将其发送到任意的碎片。

现在,你需要两件事:

  1. 红色实例所在的碎片或槽范围的地图。
  2. 一种知道哪个字符串映射到哪个槽的方法,这样您就可以在键上强制一个“切分字符串”将其路由到特定的碎片。

第一个是简单的-- CLUSTER SLOTS会给出映射,只需解析它。

第二个更棘手--但幸运的是,我已经完成了这项工作。我已经创建了一个表,将尽可能最短的字母数字字符串映射到Redis集群中的16384个插槽中。我是用C语言写的,但是你可以很容易地把它转换成任何东西。https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

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

  1. 查看时隙映射,并获取驻留在该节点上的槽范围。
  2. 在该节点的范围内选择一个槽。
  3. 请在切分表中查找该插槽的条目。
  4. 在钥匙上用花括号打那根绳子。例如,将foo转换为foo{e4x}

就这样!使用此键的任何命令都将被路由到该碎片。

伪python版本:

代码语言:javascript
代码运行次数:0
运行
复制
# 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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46294925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档