要将客户端库与 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 集群的客户端示例
以下是 Redis 客户端列表: https://redis.ac.cn/clients