Skip to content

01.绪论

说明

原文链接:https://build-your-own.org/redis/01_intro_redis

原文作者:James Smith

译者:Cheng

1.1 引言

通过从零开始编写一个Redis服务器,你将学习如何构建一个实际应用中的软件。 如果你能自己编写一个Redis服务器,那么开发其他软件对你来说都不在话下! 因为它能让你掌握两项核心技能:

  1. 网络编程 进阶的编程能力,关键在于如何实现多机协同工作。包括但不限于HTTP服务器、
    RPC*
    ,数据库、分布式系统等,都属于此类。
  2. 数据结构 人们常常说数据结构在实际的项目中毫无用处,旨在LeetCode刷题时才派上用场。但Redis无疑是对此观点的最佳反驳。基础数据结构种拥有十几种实用环境,但这前提是你对其有足够的理解,才能融会贯通,灵活运用。

1.2 什么是Redis

Redis出目前最受欢迎的内存键值存储系统,由于其内存级别的超高性能,主要被用作缓存系统。缓存服务器在现代的架构中必不可少,因为它是实现可伸缩性最简便、高效的途径。通过缓存,可以有效缓解耗时的数据库查询,显著提升系统响应速度。

一个缓存服务器本质上是通过网络提供服务的一个map<string,string>结构。但在Redis中,“值”(value)不仅仅是一个简单的字符串,它还可以是各种丰富的数据结构类型,例如:哈希(hash)、列表(list)或有序集合(sorted set),从而支持更复杂的应用场景,比如排行榜、列表分页等。正因如此,Redis才被称为数据结构服务器

1.3 为什么要从零开始

引用费曼的名言:

实践出真知*
然而,「实践」与「真知」皆有境界高低。将库组合起来并调用是一种「实践」,但你大可不必止步于此,你可以深入到底层去构建,方能领悟到更根本的原理

我们的目标不是重复制造轮子,而是使用扎实的基础知识让你脱颖而出。你将能做出更好的判断,更高效地进行调试,从而获得更广阔的职业发展机会。

1.4 为什么选择C/C++?

Redis的第一个版本是用的TCL脚本语言编写的。但那只是一个「玩具」级别的实现,最终的正式版本是用的C语言来完成的。尽管构建一个「玩具」版本是理解其工作原理的好办法,但总有 更多值得深入学习 的方面:

开发高性能软件,需要对底层进行精细控制,而这正是C/C++的强项。C语言不内置提供数据结构或网络层的抽象,这就逼迫你去学习它们的底层实现原理。

本书的代码基于纯C语言编写,仅使用极少数可选的C++特性。即便没有任何C/C++编程经验,也应能轻松阅读。我希望这能激发你学习C/C++的兴趣。当然,对于部分章节的学习,也可以使用其它的编程语言。

  • Go语言:Go语言的抽象程度虽然很高,但它仍然适合编写数据结构和进行位(bit)与字节(byte)操作。然而,由于Go拥有成熟且内置的网络库,你可能无法从中学到全部底层的网络知识。
  • Python:Python对于实现哈希表这类数据结构来说太过高层,因为这些都已内置。实际生产环境中,Python通常作为C模块的“胶水层”。不过,Python对socket编程进行了简单的封装,所以相关的网络课程依旧适用。
  • JavaScript:JavaScript的抽象程度与Python不相上下,但其内置了“隐式”的事件循环和网络功能。因此,如果要真正透彻地理解JavaScript或Go,你需要了解的就更多。

1.5 为什么要亲手实现一个Redis?

  • 这能让你为更底层的编程工作,特别是系统级开发做好准备。在通用软件开发领域被AI工具普及而价值受到挑战的当下,它能为你开辟新的职业道路。
  • 这是一个极佳的实践项目,特别是对于那些缺乏实际项目经验的学生而言。
  • 它能帮助你快速回顾计算机基础知识,这对于求职面试大有裨益。
  • 深入探究一个事物的工作原理,过程既有趣又能激发智力。

1.6 关于本书

每章都提供了完整的源代码,最终成品只需1200行,旨在聚焦核心原理,从而避免陷入不必要的细节。请注意,本书并非是一个无脑的Redis克隆,其中,许多实现方式都是为了更好的阐释相关主题而特意设计的,因此,本书的实现版本与官方的Redis并不完全兼容。

从作者那里获得帮助或通过电子邮件提问:js@build-your-own.org

1.7 系列丛书

本书属于“Build Your Own X”系列的一部分,其中X可以代表数据库、Web服务器或编译器等。你可以在网站上阅读本书的网页版。

https://build-your-own.org

中文翻译:

https://www.hutao.run/翻译