学习如何通过从零编码一个 Redis 服务器来构建真实世界的软件。如果你能写出一个 Redis 服务器,你几乎就能写出任何软件!因为它会教给你两项根本技能:
网络编程。 更高阶段的编程是"面向多台机器的编程"。想想 HTTP 服务器、RPC、数据库、分布式系统。
数据结构。 有人说数据结构没用,只在 LeetCode 题目里用得上。Redis 就是最好的反例。很多基础数据结构有非常有用的应用,但前提是你得了解得足够多,才能用得出来。
什么是 Redis?
Redis 是最流行的内存键值存储,主要用于缓存,因为没有任何存储比内存更快。缓存服务器几乎是不可避免的,因为它是最容易实现的扩容手段。一个缓存可以把慢速的数据库查询从整体路径中剥离出去。
从本质上说,缓存服务器就是一个通过网络访问的 map<string, string>
。但在 Redis 里,"value" 不只是字符串,它还可以是多种数据结构:哈希表、列表或有序集合,从而支持排名、列表分页等复杂场景。这也是 Redis 被称为"数据结构服务器(data structure server)"的原因。
为什么要从零开始?
用费曼的话说:"What I cannot create, I do not understand(不能创造,就不能理解)。" "创造"和"理解"存在不同层次。把一堆库粘在一起当然也是"创造",但你不必止步于此------你可以创造更底层的东西,理解更基础的原理。
目标并不是重复造轮子,而是掌握能让你与众不同的基础。你会做出更好的技术决策,更擅长调试,也会拥有更多的职业选择。
为什么选 C/C++?
Redis 的第一个版本是用 TCL 脚本写的,但那只是玩具版;最终产品是用 C 实现的。做一个玩具版是理解事物的好方法,但总还有更多值得学习的内容:
- 高性能软件需要对底层的控制,而这就需要 C/C++。
- C 没有内置的数据结构或网络库,它会迫使你真正去学习这些。
- 这里的代码主要是纯 C,只使用极少且可选的 C++ 特性。即便没有 C/C++ 经验也应当能读懂。我也希望这能激励你去学习 C/C++。不过,用其他语言来覆盖部分课程内容也未尝不可。
- Go 更高层一些,但在编写数据结构、处理位与字节方面仍然合适。它内置成熟的网络库,因此你不会学到完整的"从零实现网络"的那套内容。
- Python 对于自己实现哈希表这类数据结构就太高层了,因为它是内置的。很多生产级的东西其实是 C 实现,再由 Python 做胶水。Python 对 socket 只有薄薄的一层封装,所以网络部分的内容仍然适用。
- JavaScript 和 Python 一样高层,还带有"看不见的"事件循环以及内置网络能力。要完全理解 JS 或 Go,你需要超越 JS 或 Go 本身的知识。
为什么要自己实现一个 Redis?
- 它能让你为更技术性、更偏系统的软件工作做好准备,并在通用软件开发被 AI 工具稀释时,为你提供新的职业选项。
- 这是很好的练习,特别适合还没有真实项目经历的学生。
- 这是对基础知识的快速复盘,对求职面试很有帮助。
- 了解事物如何运作是有趣且能激发思维的。