学习

要将客户端库与 Redis Cluster 一起使用,客户端库需要具备集群感知能力。支持 Redis Cluster 的客户端通常提供一个特殊的连接模块来管理到集群的连接。一些优秀的客户端库遵循的过程通常如下:

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

当客户端需要读/写一个键时,它首先对键名运行哈希函数(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