用 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 工具稀释时,为你提供新的职业选项。
  • 这是很好的练习,特别适合还没有真实项目经历的学生。
  • 这是对基础知识的快速复盘,对求职面试很有帮助。
  • 了解事物如何运作是有趣且能激发思维的。
相关推荐
倒头就睡的小比特14 小时前
算法竞赛C++常用的STL
c++·算法
weilx123414 小时前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛16 小时前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车16 小时前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光17 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·17 小时前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁17 小时前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
IT大白鼠17 小时前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz17 小时前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
another heaven17 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法