用 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 工具稀释时,为你提供新的职业选项。
  • 这是很好的练习,特别适合还没有真实项目经历的学生。
  • 这是对基础知识的快速复盘,对求职面试很有帮助。
  • 了解事物如何运作是有趣且能激发思维的。
相关推荐
Roye_ack3 小时前
【项目实战 Day5】springboot + vue 苍穹外卖系统(Redis + 店铺经营状态模块 完结)
java·spring boot·redis·学习·mybatis
RIDDLE!3 小时前
Visual Studio使用C++配置OpenCV环境,同时添加模板以4.12为例
c++·opencv·visual studio
企鹅虎3 小时前
英雄C++入门到精通
c++
小虎l3 小时前
英雄C++入门到精通
c++
Bug生产工厂3 小时前
支付系统缓存策略:Redis实战与最佳实践
redis
青草地溪水旁3 小时前
设计模式(C++)详解——解释器模式(2)
c++·设计模式·解释器模式
卡卡酷卡BUG3 小时前
Redis 面试常考问题(高频核心版)
java·redis·面试
祈祷苍天赐我java之术3 小时前
Redis 缓存三大坑:击穿、穿透、雪崩的解析与解决
redis·缓存·mybatis
Kevinhbr4 小时前
CSP-J/S初赛赛后总结
c++·程序人生·ccf csp-j/s