当数据量、读/写qps超过单个Redis实例的容量时,我们需要使用 Redis 集群来存储 kv 数据。在集群中,密钥分发到多个实例。通常,有三种方法可以将密钥分片到多个实例:
假设我们有一个广告排名引擎,它本质上是一种推荐服务,可以从广告数据库中调用相关广告,并为每个ad_request对广告进行排名。排名引擎需要检索每个广告的实时出价才能执行广告竞价。由于业务对延迟的高度敏感性,所有广告的实时出价都会被计算并预加载到 Redis 集群中。广告排名引擎在其二进制文件中内置了 Redis 客户端,以便从 Redis 读取。
在客户端分片中,Redis 客户端包含分片和路由逻辑。换句话说,这是一个非常厚的客户端。优点是此体系结构不依赖于任何中间件。只有两方:Redis 客户端和 redis 节点。
中间件用作代理。来自广告排名引擎的请求将命中代理。代理包含分片和路由逻辑,用于确定访问哪个 Redis 实例来检索数据。在这种情况下,redis 客户端可以是一个非常瘦的客户端,因为它不再包含分片或路由逻辑。
去中心化分片是官方 Redis 集群中实际使用的。集群中的每个节点都维护着“路由表”的本地副本,并通过gossip协议不断更新其路由表。换句话说,不再有集中式代理。相反,每个 Redis 节点都包含充当代理所需的完整信息集。