事情发生在一个普通得不能再普通的周二。
我坐在一家准备接入千万级流量的公司会议室里,喝着他们的免费美式(讲真,很难喝),对面是一个技术面试官,眼神平静,嘴角带点杀气。
他翻了翻简历,问:小米啊,Redis 分片你了解几种?
我一愣,下意识条件反射:“客户端分片、代理分片、Redis Cluster。”
他点了点头,然后抬头,那你重点说说:基于代理服务器的分片?
空气瞬间凝固。我脑子里闪过一堆:Twemproxy、Codis、Proxy层……但如何系统地讲清楚?
这,就是今天这篇文章要陪你拆的重点。
为什么会有“代理服务器分片”这种东西?
很多人学 Redis 分片,上来就是:
一致性哈希slot slot slotcluster gossip
但其实,我们得先回到一个非常现实的问题:如果你有 3 台 Redis,你怎么让上百个业务方用它们?
你有两个选择,其中一个就是所有客户端自己算,也就是所谓的:客户端分片!
每个客户端要知道:
有几台Redis每台Redis负责哪些key如何取模 / 一致性哈希
问题是什么?
客户端SDK要升级分片规则变了,所有客户端都要改运维混乱,扩容困难
于是,人类就发明了一个“中间商”。
代理服务器分片,就是Redis世界的“中介所”
所谓基于代理服务器的分片,其实一句话讲清楚:
在客户端和 Redis 之间,加一个“代理服务器”,所有请求都先经过它,由它负责分片和转发。
架构简图你脑补一下:

客户端不需要关心:
后端有几台Redis使用什么分片规则是否扩容 / 迁移
它只管一件事:找 Proxy,发命令。分片的事情,代理帮你搞定。
代理分片解决了什么核心问题?
你可以理解为,Proxy 做了四件事:
1、统一入口
所有客户端,只对接一个地址或域名,比如:redis://proxy.company.com:6379
后面Redis怎么变,客户端完全不用改。
2、分片路由
Proxy 内部会有一套路由规则:
按 key hash按槽 slot按业务前
比如:

路由逻辑统一由 Proxy 管理。
3、支持扩容 & 迁移
当你 Redis 扩容到 5 台、10 台:
客户端不用管Proxy 更新路由方案后台慢慢做数据迁
在业务侧几乎无感。这在大型系统里非常重要。
4、屏蔽复杂性
客户端只当 Redis 是“一个大缓存池”,而不是一堆七零八落的小缓存机。对业务开发来说,体验极佳。
常见的代理分片中间件有哪些?
面试官极爱问!!!必须能说出几个典型代表:
1. Twemproxy(nutcracker)
特点:
Twitter 开源性能不错轻量级不支持复杂命令(比如事务、pipeline受限)
缺点:
功能偏简单不支持复杂的 cluster 管理
适合:
高并发但功能要求相对简单的场景。
2. Codis(国内超常用)
这个真的要重点讲,面试非常加分。
Codis 是豌豆荚开源的 Redis 分布式解决方案。
组成包括:
Codis ProxyCodis DashboardCodis ServerZookeeper / ETCD
它的架构是:
代理转发 + Slot 分片 + 可视化管理 + 自动迁移
Codis 的核心亮点:
支持在线扩容支持动态迁移对客户端完全透明运维友好
很多互联网公司生产环境都有用过。
代理分片 VS 客户端分片:面试重点对比
你在面试时可以这样优雅对比:

一句总结送你:
客户端分片是“人人自己导航”,代理分片是“统一交通指挥中心”。
面试官一听就笑了。
那代理分片有没有缺点?
当然有,技术世界没有银弹。
代理分片的几个典型问题:
1. 多了一跳网络
客户端 → Proxy → Redis必然会比直连 Redis 多一次网络开销。在超低延迟场景,需要谨慎。
2. Proxy 本身可能成为瓶颈
如果:
Proxy 挂了Proxy 性能不够Proxy 成为单点
那整个 Redis 服务就容易出事故。所以,代理服务也要:高可用、集群化、多副本。
3. 某些指令支持有限
比如涉及多个 key 的:
MGET事务Lua脚本
如果 key 分布在不同分片,Proxy 要处理就很难。Codis 是通过限制或特殊优化来解决部分问题的。
真实面试中,你可以怎么回答?
如果让我回到那天的面试现场,我会这样说(你可以直接背):
面试官问:“你说说什么是基于代理服务器的分片?”
我淡定回答:
基于代理服务器的Redis分片,是在客户端和多个Redis实例之间,引入一个代理层,由代理服务器统一接收请求,通过预设的分片规则对key进行路由转发,从而屏蔽后端多个Redis节点的复杂性。
客户端只需要连接代理地址,不需要感知具体的Redis分布,同时方便后期动态扩容和数据迁移,运维成本也更低。
常见实现有 Twemproxy 和 Codis,其中 Codis 支持slot迁移、在线扩容,生产中比较常见。
然后,看面试官的表情:从怀疑人生,变成轻轻点头。
一个真实运维故事:扩容那一夜
让我再给你讲个打工人真实故事。
某天下午,我们业务突然增长,Redis 内存飙到 80%,眼看要爆。如果是客户端分片,我们要:
改配置灰度发版客户端升级协调几十个服务
但我们用的是:Codis。运维仅做了三件事:
加机器在 Codis Dashboard 点击扩容看着 slot 慢慢迁移
业务几乎无感。那一刻,我发誓:
代理分片,是救命神器。
总结
最后我给你浓缩一波精华,你可以直接放到你的脑内小本本~
核心关键词:
Proxy转发统一入口路由分片slot迁移扩容无感常见:Codis、Twemproxy
一句话总结:
代理服务器分片,本质是通过引入中间层,把Redis分布式复杂性从客户端转移到代理层,让业务更专注,架构更清晰,扩展更便捷。
END
如果你正在准备社招面试,希望这篇“代理分片小故事”能帮你把 Redis 这道题,从模糊讲到清晰,从被问住,变成反问面试官。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!