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

70 阅读6分钟



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

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

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

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

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

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

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

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

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

  • 一致性哈希
  • slot slot slot
  • cluster 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 Proxy
  • Codis Dashboard
  • Codis Server
  • Zookeeper / 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!