使用 JedisCluster 写入 Redis 集群中的分区

Using JedisCluster to write to a partition in a Redis Cluster

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

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

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

我尝试在

浏览 JedisCluster

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

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

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

来自Redis Cluster Spec

Redis Cluster implements a concept called hash tags that can be used in order to force certain keys to be stored in the same node.

[...]

The key space is split into 16384 slots, effectively setting an upper limit for the cluster size of 16384 master nodes (however the suggested max size of nodes is in the order of ~ 1000 nodes). Each master node in a cluster handles a subset of the 16384 hash slots.

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

插槽是根据密钥计算的。好消息是,您可以使用 Key hash tags:

为密钥强制执行特定插槽

There is an exception for the computation of the hash slot that is used in order to implement hash tags. Hash tags are a way to ensure that multiple keys are allocated in the same hash slot. This is used in order to implement multi-key operations in Redis Cluster.

示例:

{user1000}.following

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

您还可以更进一步,使用映射到插槽的已知散列标签(您需要预先计算 table 或查看 this Gist)。通过使用映射到特定插槽的已知散列标签,您可以 select 插槽以及数据所在的主节点。

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