众力资讯网

Redis 分片你只会 Cluster?这套客户端 Sharding 才是老项目救命稻草

大家好,我是你们31岁爱折腾、爱总结、爱踩坑也爱分享的小米。这周我被一个刚跳槽成功的粉丝私信戳到:小米哥,面试官连问我



大家好,我是你们31岁爱折腾、爱总结、爱踩坑也爱分享的小米。这周我被一个刚跳槽成功的粉丝私信戳到:

小米哥,面试官连问我三轮 Redis 集群,我啥都答对了,结果最后被他一句:

“你们有没有用过客户端分片?讲讲你们的 Redis Sharding 怎么设计的?”

我当场破防……

说实话,这题要是放在三年前,我也得沉默良久。但现在,谁问我 Redis Sharding,我心里只有四个字:稳如老狗。

来,今天咱们就用讲故事 + 面试拆解的方式,聊透:

「基于客户端配置的 Redis Sharding」。

从一次“血崩”的线上事故说起

时间回到我刚入职第二年的某个凌晨 2 点。我们有个活动系统,全网发优惠券,流量直接爆了。开发的时候图省事,直接搞了一个 Redis 单点:

活动用户 -> Redis -> MySQL

结果活动开始 5 分钟:

Redis CPU 直冲 100%

连接数爆满

QPS 下降

接口延迟飙升

老板在群里吼:“你们活动要凉了?”

从那天开始,我第一次正视一个问题:

Redis 单机,再猛也有天花板。

于是我们开始搞 —— Redis Sharding,分片。

面试官最爱问的问题:你们为什么不用 Redis Cluster?

很多人一被问到 Redis 分片。第一反应就是:

我们直接上 Redis Cluster 啊,槽位分片不香吗?

没错,Redis Cluster 是官方方案,很牛,但现实世界里,并不是所有项目都适合它。那我们当时为什么选了:客户端分片(Client Side Sharding)?

三个原因:

第一,历史包袱:老系统大量用的是 Jedis + Redis Standalone,改动成本高。

第二,架构演进期:我们当时上云架构还没完全迁完,不适合大动干戈改成 Cluster。

第三,灵活性更高:客户端控制 KEY 到节点的映射规则,迁移成本可控。

所以,最终我们选了一个经典但很社招题的方案:

基于客户端配置的 Redis Sharding。

什么是“基于客户端配置的 Redis Sharding”?

给你一个面试官满意版解释:

客户端分片,是由业务服务在写入或读取时,通过特定分片算法,将不同的 Key 路由到不同 Redis 实例,而不是由 Redis Server 或 Cluster 负责分布数据。

再人话一点:

Redis 自己不分片,是我们客户端主动决定数据放哪台 Redis 上。

你可以想象成:

一个快递分拣站,快递不是自己跑,而是快递员看地址,送往不同仓库。

典型结构长这样:

问题来了:

你怎么决定一个 Key 落到 Redis-2 还是 Redis-3?

这就得讲分片算法了。这是社招面试必考点,可以直接默背:

取模分片:最简单,但也最容易翻车

最经典:

shard = hash(key) % N

比如:

user:1001 → hash后 % 4 → 落在 redis-1

user:1002 → hash后 % 4 → 落在 redis-3

优点:简单,性能高

缺点:扩容就是灾难(所有 Key 都要重新计算)

一旦从 4 台机器扩到 6 台,你直接重来一场“数据大迁移地狱”。

面试官追问你:“那你们怎么解决扩容问题?”这时候别慌,我们接着说升级版。

一致性 Hash(Consistent Hash)

这个在社招里非常加分。

核心优点:

新增/移除节点时,只影响少部分数据

大量 Key 不需要迁移

实现方式一般是:

构建一个 Hash Ring

每个 Redis 实例对应多个虚拟节点

key 映射到最近的顺时针节点

这时候你可以淡定说一句:

我们线上用的是带虚拟节点的一致性哈希,减少数据迁移成本。

面试官一般到这里已经开始点头了。

Range 分片(按范围)

比如你是按用户 ID:

0 ~ 1千万 -> Redis 1

1千万 ~ 2千万 -> Redis 2

优点:规则清晰

缺点:数据容易倾斜,新用户可能都挤在一个节点。

所以你可以加一句:

Range 分片不太适合写多读多的热点业务,我们后来还是迁移到一致性哈希。

这就是标准优秀社招回答。

客户端分片在工程中的真实实现

光会说还不够,我给你讲讲我们当时在项目中的设计。

1、配置驱动的 Sharding

我们没有把节点写死在代码里,而是走配置:

然后在启动时加载进一个 Sharding Router。

以后要扩容?改配置,重启服务即可。

2、自己实现路由器 RedisRouter

伪逻辑类似这样(你面试不需要写代码,但要会讲):

对 key 进行 hash

根据 hash 计算 shardIndex

从 Redis 客户端池中选择对应节点

执行 GET / SET

面试官听完,基本会问一句:

那你们怎么处理扩容数据迁移?

这个问题是关键。

数据迁移你怎么做?这题92%的人答不上来

我们当时是这么搞的:

1、双写策略

新规则上线时:

同时写入新节点 + 老节点

读优先从新节点读

2、后台迁移脚本同步数据

通过扫描老 Redis 分片数据,重新写入新规则的分片。

3、观察一段时间后切流

确认新节点数据完整,再停掉老节点。

这套设计你可以浓缩成一句话:

我们采用双写 + 后台迁移 + 灰度切流的方式完成分片扩容。

这句话,社招面试非常给力。

客户端 Sharding 的优缺点总结

你答题时可以这样总结:

优点:

灵活可控

可按业务自定义规则

不依赖 Redis Cluster

缺点:

业务侵入大

运维复杂

一旦算法变更,迁移成本高

然后再补一句:

所以后期如果业务复杂度上升,我们也会评估是否迁移到 Redis Cluster 或云厂商托管方案。

面试官听到这里,基本不会再为难你了。

真实面试复盘:我是怎么征服面试官的?

最后分享一个真人案例。去年我跳槽,一位阿里出来的面试官问我:

“你们做 Redis Sharding,是怎么设计扩容方案的?”

我当时就把:

客户端分片

一致性哈希

双写迁移

灰度切流

配置中心控制

一套说完。他说了一句让我记了一年:

“这一块,你们是真的踩过坑,有线上实战。”

没错,很多技术问题,只有流过血,面试才讲得有底气。

结语:技术不是背出来的,是摔出来的

如果你看到这里,说明你对 Redis 不是只想应付面试,而是真想学通。记住一句话:

Redis Sharding 不是理论题,是“踩坑题”。你可以背出它所有概念,但真上生产,才知道什么叫数据迁移像搬家,热 Key 像春运。

END

希望这篇文章,能成为你社招路上的一盏小灯,欢迎留言~