【问题标题】:Using JedisCluster to write to a partition in a Redis Cluster使用 JedisCluster 写入 Redis 集群中的分区
【发布时间】:2016-10-01 13:48:00
【问题描述】:

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

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

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

我尝试通过JedisCluster lib at

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

但找不到任何东西。请帮忙? 提前感谢您的帮助。

【问题讨论】:

    标签: redis partitioning jedis redis-cluster


    【解决方案1】:

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

    来自Redis Cluster Spec

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

    [...]

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

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

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

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

    例子:

    {user1000}.following
    

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

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

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

    【讨论】:

    • 感谢您的更新。一定会尝试使用它。
    • 我正在浏览 redis 和 jedis 文档。还有一个叫做 JedisFactory 的东西可以让我设置一个数据库索引。这个数据库索引会起到同样的作用吗?我提供了相同的链接 - github.com/xetorthio/jedis/blob/…
    • Redis Cluster 不支持多个数据库(数据库编号)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2017-06-20
    • 2020-02-24
    • 2020-09-27
    相关资源
    最近更新 更多