学习

要将客户端库与 Redis 集群一起使用,客户端库需要是集群感知的。支持 Redis 集群的客户端通常具有用于管理与集群连接的特殊连接模块。一些更好的客户端库通常遵循这样的流程

客户端连接到集群中的任何分片并获取其余分片的地址。客户端还获取哈希槽到分片的映射,以便它知道在特定哈希槽中查找密钥的位置。此哈希槽映射在本地缓存。

当客户端需要读取/写入密钥时,它首先对密钥名称运行哈希函数 (crc16) ,然后模除以 16384,这将导致密钥的哈希槽号。

在下面的示例中,密钥“foo”的哈希槽号为 12182。然后,客户端检查哈希槽号与哈希槽映射,以确定应该连接到哪个分片。在我们的示例中,哈希槽号 12182 位于分片 127.0.0.1:7002

最后,客户端连接到分片并找到它需要处理的密钥。

如果集群的拓扑结构因任何原因而发生变化,并且密钥已移动,则分片将以 (error) MOVED 15495 127.0.0.1:7006 错误进行响应,并返回负责该密钥的新分片的地址。这表明客户端需要重新查询集群的拓扑结构和哈希槽分配,因此它将执行此操作并更新其本地哈希槽映射,以备将来查询。

并非所有客户端库都内置了此额外逻辑,因此在选择客户端库时,请确保查找具有集群支持的库。

另一个要检查的细节是客户端是否在本地存储哈希槽映射。如果它没有,并且它依赖于 (error) MOVED 响应来获取正确分片的地址,您可以预期比平时更高的延迟,因为您的客户端可能需要对很大一部分请求进行两次网络请求而不是一次。

支持 Redis 集群的客户端示例

  • Java: Jedis
  • .NET: StackExchange.Redis
  • Go: Radix, go-redis/redis
  • Node.js: node-redis, ioredis
  • Python: redis-py

这是一个 Redis 客户端列表: https://redis.ac.cn/clients