从懵逼到自信:Redis 基于代理分片一篇搞懂

事情发生在一个普通得不能再普通的周二。

我坐在一家准备接入千万级流量的公司会议室里,喝着他们的免费美式(讲真,很难喝),对面是一个技术面试官,眼神平静,嘴角带点杀气。

他翻了翻简历,问:小米啊,Redis 分片你了解几种?

我一愣,下意识条件反射:“客户端分片、代理分片、Redis Cluster。”

他点了点头,然后抬头,那你重点说说:基于代理服务器的分片?

空气瞬间凝固。我脑子里闪过一堆:Twemproxy、Codis、Proxy层……但如何系统地讲清楚?

这,就是今天这篇文章要陪你拆的重点。

为什么会有“代理服务器分片”这种东西?

很多人学 Redis 分片,上来就是:

一致性哈希slot slot slotcluster gossip

但其实,我们得先回到一个非常现实的问题:如果你有 3 台 Redis,你怎么让上百个业务方用它们?

你有两个选择,其中一个就是所有客户端自己算,也就是所谓的:客户端分片!

每个客户端要知道:

有几台Redis每台Redis负责哪些key如何取模 / 一致性哈希

问题是什么?

客户端SDK要升级分片规则变了,所有客户端都要改运维混乱,扩容困难

于是,人类就发明了一个“中间商”。

代理服务器分片,就是Redis世界的“中介所”

所谓基于代理服务器的分片,其实一句话讲清楚:

在客户端和 Redis 之间,加一个“代理服务器”,所有请求都先经过它,由它负责分片和转发。

架构简图你脑补一下:

从懵逼到自信:Redis 基于代理分片一篇搞懂

客户端不需要关心:

后端有几台Redis使用什么分片规则是否扩容 / 迁移

它只管一件事:找 Proxy,发命令。分片的事情,代理帮你搞定。

代理分片解决了什么核心问题?

你可以理解为,Proxy 做了四件事:

1、统一入口

所有客户端,只对接一个地址或域名,比如:redis://proxy.company.com:6379

后面Redis怎么变,客户端完全不用改。

2、分片路由

Proxy 内部会有一套路由规则:

按 key hash按槽 slot按业务前

比如:

从懵逼到自信:Redis 基于代理分片一篇搞懂

路由逻辑统一由 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 客户端分片:面试重点对比

你在面试时可以这样优雅对比:

从懵逼到自信:Redis 基于代理分片一篇搞懂

一句总结送你:

客户端分片是“人人自己导航”,代理分片是“统一交通指挥中心”。

面试官一听就笑了。

那代理分片有没有缺点?

当然有,技术世界没有银弹。

代理分片的几个典型问题:

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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

© 版权声明

相关文章

暂无评论

none
暂无评论...