当前位置: 首页 > 面试题库 >

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

解博明
2023-03-14
问题内容

我想让我的多锁位于不同的Redis实例上。

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

你能给我一些建议吗?


问题答案:

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

现在,您需要两件事:

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

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

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

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

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

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

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

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

  4. 用键上的花括号将字符串拍打。例如转换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)


 类似资料:
  • 我需要向用户显示以下座位并能够预订和取消预订。 我也尝试了unordered_map,但无论我做什么,我都无法使map以我想要的方式显示座位(1A,1B,1C,1D,1E)。 1A 1B 1C 1D 1E 2A 2B 2C 2D 2E... 尝试将座位名称更改为A1 B1 C1 D1...显然,我是C++新手。我知道地图是有序的,并且我知道使用unordered_map无法保证地图的显示方式。 我

  • 问题内容: 我有一个私人仓库,我想安装在我的package.json文件中。 默认情况下,npm使用您的默认私钥。我希望能够指定运行时应使用哪个ssh密钥npm 。有什么办法吗? 问题答案: 以下是一些解决方案: 在其中添加一个条目。例如: 预先使用并将密钥添加到代理实例。 使用诸如ssh-ident之类的东西可以根据当前的工作目录或传递给ssh-ident的参数动态选择ssh代理和身份。正如他们

  • 我们可以使用这些jvm标志来确定编译阈值,但是有没有一种方法可以在运行时以编程方式确定它?

  • 问题内容: 我们需要以一种特殊的格式(而不是默认格式)对返回日期进行排序。据我所知,没有办法通过选项或其他任何方式进行设置。缺少每次获取日期后都手动更新日期的功能,有人能够轻松解决此问题吗?还是我错过了什么? 问题答案: 您可以定义自定义实例方法getDate / setDate,该方法将在序列化内部表示形式和所需格式之间转换日期,例如http://sequelize.readthedocs.or

  • 考虑下面的代码: 运行时,它输出以下内容: 这很酷,我们可以很容易地转储一个结构,但是我的一些数据结构包含位掩码或其他不容易在基数10中读取的数据。对于位字段,读取它会更容易,它们的输出类似于。 有没有一种简单的方法可以获得这样的输出,而不直接在结构上实现trait(在另一种类型上实现trait就可以了)? 如果有必要,我可以使用不同的类型,但是我希望保持结构本身的调试特性像一样简单。

  • 问题内容: PMD可以忽略Java源文件中带有注释的特定警告。 Checkstyle有类似的选择吗? 问题答案: 是的,请查看SuppressionCommentFilter和SuppressWithNearbyCommentFilter选项。