0

我有一个 Redis 集群。我正在使用 JedisCluster 客户端连接到我的 Redis。

我的应用程序有点复杂,我想基本上控制我的应用程序中的哪个分区数据。例如,我的应用程序由子模块 A、B、C 组成。然后我希望子模块 A 中的所有数据都应该转到分区 1。类似地,来自子模块 B 的数据应该去分区 2,以此类推。

我正在使用JedisCluster,但我没有找到任何 API 可以写入集群上的特定分区。我假设我将在我的所有 Redis 节点上具有相同的分区名称,并处理哪些数据将自动处理到哪个节点,但我将处理哪个分区。

我尝试通过JedisClusterlib

https://github.com/xetorthio/jedis/blob/b03d4231f4412c67063e356a7c3acf9bb7e62534/src/main/java/redis/clients/jedis/JedisCluster.java

但找不到任何东西。请帮忙?在此先感谢您的帮助。

4

1 回答 1

2

Redis 集群不是这样工作的。使用 Redis 集群,每个节点(分区)都有一组定义好的键(槽)来处理。将密钥写入未由主节点提供服务的主节点会导致命令被拒绝。

来自Redis 集群规范

Redis Cluster 实现了一个称为哈希标签的概念,可用于强制将某些键存储在同一节点中。

[...]

密钥空间被分成 16384 个插槽,有效地为 16384 个主节点的集群大小设置了上限(但是建议的最大节点大小约为 1000 个节点)。集群中的每个主节点都处理 16384 个哈希槽的子集。

您需要在集群配置级别定义哪个主节点专门服务于特定插槽或一组插槽。配置导致数据局部性。

插槽是根据密钥计算的。好消息是,您可以通过使用Key hash tags为密钥强制执行特定插槽:

用于实现哈希标签的哈希槽的计算有一个例外。哈希标签是一种确保在同一个哈希槽中分配多个键的方法。这用于在 Redis Cluster 中实现多键操作。

例子:

{user1000}.following

之间的内容{…}用于计算槽。密钥哈希标签允许您在特定节点上对密钥进行分组,并在使用任意哈希标签时强制执行相同的数据局部性。

您还可以通过使用映射到插槽的已知哈希标签更进一步(您需要预先计算表格或查看此要点)。通过使用映射到特定插槽的已知哈希标签,您可以选择插槽以及数据所在的主节点。

其他一切都由您的 Redis 客户端处理。

于 2016-06-02T07:12:51.650 回答