用 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 工具稀释时,为你提供新的职业选项。
  • 这是很好的练习,特别适合还没有真实项目经历的学生。
  • 这是对基础知识的快速复盘,对求职面试很有帮助。
  • 了解事物如何运作是有趣且能激发思维的。
相关推荐
鱼子星_15 分钟前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
郝学胜-神的一滴21 分钟前
[简化版 GAMES 104] 现代游戏引擎 05:游戏引擎世界构建核心机制深度解析
c++·程序人生·unity·游戏引擎·计算机图形学·opengl
acd1200925 分钟前
Redis 缓存和数据库一致性,到底怎么搞?
数据库·redis·缓存
CodeBlog-star31 分钟前
AI Agent 高并发实战:Redis 限流、队列、缓存与高可用全栈方案
数据库·redis·缓存
Darkwanderor32 分钟前
C++的流简介和简单使用
开发语言·c++
乐观勇敢坚强的老彭42 分钟前
C++ STL 常用容器的速查表
java·c++·算法
lingran__1 小时前
C++ STL map 与 set 底层剖析与模拟实现万字详解|基于红黑树,复刻 SGI-STL 泛型复用架构
开发语言·c++·stl·set·map·泛型编程·sgi-stl
星轨初途2 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
重生之小比特2 小时前
【初阶C++】内存管理
c++·内容运营
不会代码的小猴11 小时前
21. 泛型编程上
开发语言·c++·笔记·算法