Redis 进化史:一家“小饭馆”如何逆袭成“连锁帝国”

为了让大家彻底搞懂 Redis 的架构演进,我们不讲枯燥的代码,来讲一个关于“饭馆老板大白”的创业故事。这个故事里,每一个阶段都对应着 Redis 的一个核心技术。


第一阶段:单打独斗的“苍蝇馆子”(单机 Redis)

大白开了一家小饭馆,生意不错。但他有个致命烦恼:记性太差。
客人点完菜,他把菜单记在脑子里(内存)。万一突然停电(宕机),或者他累晕了,所有菜单全忘了,客人全跑光。

知识升级 1:RDB(拍快照)—— 给仓库拍全景照片

为了解决“断电丢单”的问题,大白想了个办法:每天晚上打烊后,把整个菜单库拍一张全景照片,存到保险柜里(硬盘)。

  • 知识点:这就是 RDB 持久化。全量备份,恢复时直接把照片铺开,速度极快。
  • 痛点:拍照太累,要遍历整个仓库。如果下午 3 点停电,那 3 点之前没拍照的订单全丢了。

知识升级 2:AOF(记流水账)—— 每笔订单都写日记

大白觉得拍照太慢,改成了每来一个客人,就立刻在日记本上写一笔:“8:00 张三点了宫保鸡丁”、“8:01 李四点了鱼香肉丝”。

  • 知识点:这就是 AOF 持久化。记录过程(写命令),丢数据少。
  • 痛点:日记本越写越厚(文件变大),而且如果大白每次点单都停下来写日记,客人会等得不耐烦(性能下降)。

知识升级 3:aof_buf(前台小本子)—— 缓冲一下

大白学聪明了:客人点单时,先记在前台的小本子(aof_buf)上,然后每秒钟统一把这些订单抄到日记本里。

  • 知识点:这就是 AOF 缓冲区。兼顾了性能(不频繁写硬盘)和安全(最多丢 1 秒数据)。

知识升级 4:AOF 重写(合并订单)—— 精简日记

日记本里写着:“张三点了宫保鸡丁”、“张三又加了一碗米饭”、“张三又加了一瓶可乐”。
大白想:太啰嗦了!我直接把这三条合并成:“张三点了宫保鸡丁+米饭+可乐”。这样日记本就变小了,恢复起来也快。

  • 知识点:这就是 AOF 重写。直接看当前内存的最终状态,生成最精简的命令。

小结:单机时代,大白学会了 RDB + AOF,保住了数据不丢,但饭馆依然只能接待有限的人。


第二阶段:招兵买马(主从复制)—— 读的活儿分给小弟

饭馆火了,客人排长队。大白一个人又要接待点单(写),又要给客人看菜单(读),忙不过来。而且,如果大白累倒了,饭馆直接倒闭。

大白决定:招几个小弟(从节点)。

  • 大白(主节点):只负责“写”,比如点单、改单。
  • 小弟们(从节点):只负责“读”,比如给客人看菜单、结账。

知识升级 5:全量同步与 replication buffer(新小弟入门)

新来的小弟什么都不会,大白得把之前所有的菜单数据教给他(发 RDB)。在教小弟抄笔记期间,新来的客人点了新菜,大白拿个小本本(replication buffer)记下来,等教完旧笔记,再补发给小弟,保证数据一致。

知识升级 6:offset(复制偏移量)—— 小弟掉线重连

有个小弟上个月请假 10 分钟,结果大白把所有的菜谱全重新教了他一遍,太浪费时间了。
大白想了个办法:在每份菜单上标上页码(offset)。小弟掉线重连后,直接说:“大哥,我读到第 500 页了。” 大白就把第 501 页以后的内容补发给他,不用从头再来。

  • 知识点:这就是 增量同步,基于 offset。

小结:主从复制解决了读并发和备份问题,但大白依然很累,而且如果大白累倒了,谁来当主心骨?


第三阶段:请个“大管家”(哨兵模式)—— 自动容灾

大白意识到:如果自己突然病倒,几个小弟只会读不会写,饭馆还是得停业。必须有人能在自己倒下时,立刻站出来指挥。

大白请了一个“大管家”(哨兵)。

  • 大管家啥也不干,专门盯着大白。如果大白 10 秒钟没反应,大管家就在群里问其他管家(哨兵集群):“你们看大白是不是挂了?”

  • 多个管家确认(客观下线)后,他们根据“谁离大白最近(断线时间短)”、“谁资历最老(优先级高)”、“谁菜单最全(offset 大)”这三个标准,从几个小弟里选出一个新的大堂经理。

  • 知识点:这就是 哨兵模式(Sentinel)。实现了自动故障转移(高可用)。

小结:哨兵让饭馆实现了“无人值守”,但饭馆的容量还是有限的——因为每个小弟手里都拿着一模一样的完整菜单,饭馆再大,桌子也就这么多(内存受限)。


第四阶段:开连锁店(Redis Cluster)—— 数据分片

饭馆要存放 100 万道菜谱,一个店根本放不下。大白决定开连锁店!

他定了个规矩:一共有 16384 个储物柜(哈希槽)。

  • 总店(节点 A)管 0~5000 号柜子。
  • 东区分店(节点 B)管 5001~10000 号柜子。
  • 西区分店(节点 C)管 10001~16383 号柜子。

客人来点菜,先算一下菜名的哈希值,决定这道菜属于哪个柜子,然后去对应的分店存取。

  • 知识点:这就是 Redis Cluster 的哈希槽(Hash Slot),实现了数据分片。

知识升级 7:Gossip 协议(八卦聊天)

这么多分店,怎么知道谁管哪些柜子?店长们每天喝茶聊天,互相八卦:“我是东区,管 5001~10000 号柜,你呢?” 一传十,十传百,所有店长都知道了整个帝国的地图。

  • 知识点:这就是 Gossip 协议,节点间互相通信同步状态。

知识升级 8:MOVED 重定向(指路)

客人跑到总店想存“宫保鸡丁”,总店一算,这道菜属于 8000 号柜子,归东区管。总店说:“出门左转,去东区办。” 客人(客户端)记住这个规矩,下次直接去东区。

  • 知识点:这就是 MOVED 重定向。

知识升级 9:集群的高可用

每个分店(主节点)也有小弟(从节点)。如果总店倒了,其他分店长投票,从总店的小弟里选一个新总店长,接管它的柜子。

小结:集群模式通过数据分片,解决了海量数据存储和水平扩展的问题。


终极总结:大白的创业感悟

阶段 大白的痛点 解决方案 对应技术
1. 单机 断电丢数据 拍照片 + 记日记 RDB + AOF
2. 主从 一个人忙不过来 招小弟,读的活儿分出去 主从复制、offset
3. 哨兵 自己病倒没人管 请大管家盯着,自动选新老大 Sentinel、投票、客观下线
4. 集群 饭馆太小装不下 开连锁店,分柜子管理 Cluster、16384 哈希槽、Gossip

总结:
为了不丢数据,搞了持久化;为了扛并发和备份,搞了主从;为了自动容灾,搞了哨兵;为了存海量数据,最终搞了集群。这就是 Redis 的完整进化史。