用 C/C++ 从零实现 Redis——简介

学习如何通过从零编码一个 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 工具稀释时,为你提供新的职业选项。
  • 这是很好的练习,特别适合还没有真实项目经历的学生。
  • 这是对基础知识的快速复盘,对求职面试很有帮助。
  • 了解事物如何运作是有趣且能激发思维的。
相关推荐
无限进步_3 分钟前
C++异常机制:抛出、捕获与栈展开
开发语言·c++·安全
王老师青少年编程16 分钟前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维前缀和】:宝石串
c++·前缀和·csp·高频考点·信奥赛·宝石串
梓䈑16 分钟前
【算法题攻略】模拟
c++·算法
vKd0Ff21L24 分钟前
如何在Dev-C++中设置TDM-GCC为默认编译器第九十一篇
java·jvm·c++
cany100032 分钟前
C++ -- 型号比对和constexpr
c++
楼田莉子32 分钟前
C++17新特性:结构化绑定/inline变量/if相关的变化
c++·后端·学习
翎沣37 分钟前
C++面向对象三大特性
开发语言·c++
无限进步_1 小时前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
小鱼️遨游1 小时前
openCPU SDK 安装和第一次编译方法、注意事项
c++·opencpu·ml307
basketball6161 小时前
C++ iostream 完全指南:从 cin/cout 到流式编程的奥秘
开发语言·c++