跳转至

结束语 Redis源码阅读,让我们从新开始

你好,我是蒋德钧。不知不觉中,我和你又一起走过了3个多月的时光。在这3个多月的时间里,我和你一起并肩作战,去学习和了解了Redis的源码。跟第一季的课程内容相比,这一季学习的内容的确更有难度,也更加需要你能静下心来钻研。

这里先感谢你的一路陪伴,我们一起走到了现在。做这样一门专栏,我自己也是收获了很多、成长了很多。那么最后一节课,我就把我在做这门课程里三点最重要的认知分享给你,我们一起持续精进。

用源码重新认知你的知识体系

其实,要是用一句话来总结我的感受,那就是,阅读源码让我感到“从新开始”。

我在学习Redis源码之前,已经对Redis的一些基本原理、一些常见的后端系统设计都有了了解和掌握,本身也有一些C语言的开发经历。我相信,我当时的状态和此刻正在阅读这篇结束语的你可能很相似。

而在学习了Redis源码后,我发现自己在C语言编程技巧、计算机系统关键机制,还有系统设计原则等等很多方面,都有了新的认识。这些新认知,是源于对Redis源码设计与实现的学习,而源码学习本身又给我提供了高于Redis的通用知识的掌握,这让我受益匪浅。

就比如说,我以前在学习操作系统时,了解了进程间通信的方法有消息队列、命名管道、无名管道、共享内存等等,但是一直没能建立直观的认知。而在阅读Redis源码时,我发现Redis广泛地使用了无名管道,来支持父子进程间的通信。这一下子就在我的知识体系中,增加了对管道实际开发使用的新认知,这也让我有了一种实践正好结合理论的体会。

而另一方面,我以前在实现一些数据结构和算法时,都会按照它们在书本上的定义去实现。但是,在阅读Redis源码过程中,我发现其实实践和理论又是有差异的。就像Redis中的字符串根据不同长度,使用了不同的数据结构实现;有序集合使用了两种数据结构的组合来实现;以及LRU算法采用了近似方法来实现等等。

这些实际代码让我的知识体系,对实践结合理论又有了新的认识:其实在实际系统开发中,我们通常要考虑性能、空间、复杂度等约束条件,会在理论基础上进行优化开发。这一新认知对我后来的开发工作有了很大帮助,我会有意识地识别所开发系统面临的约束,进而优化自己的实现方法。

其实从Redis的源码中,我们可以掌握很多计算机系统知识,这些新知识,或许我们在目前的工作里还用不到,甚至在日后不断学习的过程中,还会被更新迭代掉。但是我们要清楚一点,就是我们在某一阶段所掌握的知识,往往会是下一阶段知识的基础。

源码阅读本身就是一个结合之前学习的理论和开发知识,进一步学习实践开发知识的过程,这是一种从知识再到知识的过程,也是让我们重新认知自己知识体系的过程。

用源码重新磨炼你的意志力

阅读源码是一件很辛苦的事情,尤其是当我们面对一个庞大的代码结构时,往往就会感到无从下手了。而等到我们好不容易摸清了代码结构,知道了要从哪些关键函数开始看起时,我们又会面临代码中复杂的调用关系、高级的语法实现,同时,还要尝试去理解代码开发者的思路。这些都是我们在阅读代码过程中的拦路虎,很容易就让我们打退堂鼓了。

我自己在阅读源码时,这些问题也都碰到了。不过,我把这个过程看成是对自己意志力的一个磨炼,越是遇到困难,越要迎难而上,而不能轻言放弃。

虽然我们也能通过坚持做某些事来磨炼自己的意志力,但是阅读代码的挑战性更大。这是因为代码是细节,而掌握细节需要我们有足够的静心、耐心和细心。这和学习原理不一样,学习原理的时候,我们的头脑往往转得很快,有些机制我们会想当然地认同了。

而阅读代码就不能这样了,一段代码不理解就是不理解,我们是无法想当然认同的。我们只有在不断尝试理解代码的过程中,正视自己想要放弃的心理和消极情绪,并能找到原因记录下来,然后逐渐减少阻力,以及慢慢提高自己想要放弃它的心理阈值。这正是阅读源码给我的意志力带来的新磨炼。

当然除了有意志力的支持,我们也需要有合理的方法。我之前看过一本书叫做《干劲的开关》,其中有句话是这样说的:“影响结果的不是斗志,而是科学”。所以我在读源码的时候,我就把阅读代码的目标拆分得更加细粒度化,每天、每周完成一些小目标,日积月累,等到我把Redis源码主要部分阅读完后,我收获了很大的成就感,因为我做到了。

而且在那之后,我也发现自己再做其他一些具有挑战性的工作时,阅读源码时得到磨炼的意志力就会发挥积极作用,让我自己不再畏惧困难,而是会积极应对。那么相对应地,我希望你在阅读源码的时候,也能够不要被代码的复杂结构或是错综调用关系所吓倒,而是规划好切实可达的目标,一步一个脚印地去完成代码的学习。

用源码重新塑造你的做事原则

我之前在做事时,通常都是直线思维,定了一个目标就希望一次性完成这个目标。但有时受限于自己的知识背景和能力,对如何一次性完成目标会感到很困惑。

而在阅读Redis源码时,我遇到了相同的困惑:我一直奔着一定要把主要代码和关键技术掌握好这个目标而学习。但是在源码阅读的过程中,我有时在阅读了部分代码后,又会忘了之前学习的一些细节。而且对于在学习时已经厘清的概念和方法,等过一段时间之后,我发现又会变得模糊了。

后来,我自己在开发一个系统时,经常会去再回顾Redis源码。等这个系统开发完成后,我发现,原先变得模糊的Redis代码细节,已经变成深刻的记忆沉淀下来了。

在那个时候,我想明白了,源码阅读从来都不是一个一次性的学习过程。相反,源码阅读过程就像是DNA的双螺旋结构一样,是一个循环向上的过程。从源码阅读中学习开发知识,了解系统实现,然后再用学到的知识反哺自己的系统开发。而在开发过程中,又会再次阅读源码,进行学习,将自己的认知重新提升一个层次。这个过程周而复始,循环向上。

其实,我们日常的学习和做事跟源码阅读也是很相似的,它是一个循环向上的过程。很多事情并不是一蹴而就的,我们需要经历“认知、实践、再认知、再实践”这样一个过程。在这个过程中,我们会遇到困难,也会有收获,但是这些困难或收获都是为了下一次的认知和实践打基础。所以,我们不要因为一时的挫折而气馁,也不要因为一时的成就而停滞,就像生命之源的DNA结构一样,我们螺旋上升。

写在最后

今天正好是周六,是个承前启后的时刻,这一季课程也要在今天正式画上一个句号了。不过,这个句号既是一个阶段的结束,更是一个新阶段的开始。

其实很多时候,你的成功并不取决于你知道了多少,而是你知道在无知的时候该怎么做。我希望上面讲的三点关于阅读源码的认知,能够给你的工作和生活提供一些指导方向。当我们在学习一个不会的知识点时,当我们在学习一门新的语言时,当我们面对生活中各种各样的情况必须孤立地做出反应时,我希望你能联想到学习源码的底层逻辑,从而更好地作出自己的选择。

最后,到了我们说再见的时候了,再次感谢你的一路相伴,我相信现在我们都成长了很多。而从今天起,我们在学习的道路上又将是一个新征程,让我们从新开始,学以致用。

最后的最后,我还给你准备了一份毕业问卷,希望你能花两三分钟填写一下,我非常期待能听到你对这门课的反馈。

好了,天长地久有时尽,学习之路绵绵无绝期,我们下一次再会!

精选留言(9)
  • Kaito 👍(28) 💬(3)

    时间过得真快,这次又和第一季 Redis 专栏一样,全程跟了下来,并在留言区持续输出了 3 个多月。 按照惯例也做一个总结,这 3 个多月在评论区写下的留言 + 1 篇加餐文章,共计输出近 4 万字,又被自己吓到,再次见证时间的力量。 这个专栏学习难度要比第一季高很多,刚开始很担心无法做到持续输出,但还是咬牙坚持下来了,又一次突破了自己。 虽然之前已经读了不少 Redis 源码,但这次全程跟下来,还是收获很多,又给自己的 Redis 知识图谱补充了更多细节。这也让我再次体会到,要想真正吃透一项技术,反复咀嚼是必做的功课。 这次写留言比上一季难度大了很多,由于源码涉及到的都是细节,每次写留言时,都至少要把文章读 2 遍以上,然后再翻一遍源码,不确定的地方反复查资料确认,这也再次印证了那句话:输出就是最好的输入。 从第一季到第二季,这一年的时间里,自己也从一个学习者,逐渐变成一个持续输出者,心态也变得更加开放,敢于迎接挑战。 专栏虽然结束,但成长之路不会停歇,就像专栏所说的,这既是一个阶段的结束,但更是一个新阶段的开始,共勉!

    2021-11-06

  • 曾轼麟 👍(3) 💬(0)

    感谢蒋老师两个专栏的倾囊相授,通过这3个多月的学习我在这期间也成长了许多,也了解到了许多我曾经没注意到的Redis细节。 由于最近自己近期刚刚成立了家庭,以及年底公司业务量攀升的原因,到专栏后期我的学习进度有点脱离了大部队,很抱歉专栏后期没能再次积极的参与到专栏的讨论中来。 总结: 本期整篇专栏按照 导读 -> 数据结构 -> 事件驱动设计与执行层 -> 缓存模块 -> 可靠性保证 -> RedisCluster -> 编程技巧 -> 每日一课答疑 的顺序给我们基本上完整的介绍了一遍Redis的源码实现和底层设计原理,当然Redis还有许多更加细节的内容等待着我们发掘比如:Lua的整合实现,RESP的编解码,混合模式持久化等等,也相信大家一定会继续深入下去。 在本专栏的学习中,我也从老师介绍【主从复制,哨兵Raft实现,Pub/Sub故障迁移】的这几篇文章中得到启发,并且在近期和同事知识分享后发现,系统设计方面的知识也很重要,于是我购买了《数据密集型应用系统设计》这本书,打算进一步的学习。 Redis其实是一款很轻量级的内存数据库,但是麻雀虽小内脏俱全,Redis很多时候的设计甚至很前卫,比如在哨兵选主上面使用Raft的实现方式,可以说在某种程度上领先了kafka的设计,kafka直到近期才提出要摆脱zookeeper的束缚。此外Redis的持久化混合模式(AOF + RDB)也是一种特别的思路去解决持久化的问题,而这些都值得我们进一步的学习。 最后,Redis是一款设计优秀的产品,非常值得我们继续的深入研究和学习。在学习期间收获的无论是编码技巧,操作系统知识,计算机原理知识,还是数据结构知识,都能让我们的能力得到进一步的提升。

    2021-11-15

  • Geek_728b54 👍(0) 💬(0)

    可以加入老师的组织么?

    2024-01-09

  • neohope 👍(0) 💬(0)

    感谢老师,收获满满。之前由于各种原因,中断了两个月,今天终于看完了。 老师的课程总有一种帮大家从繁杂事务中梳理出清晰主线的神奇功效,希望老师继续出其他课程啊,再次感谢!

    2022-03-30

  • 木几丶 👍(0) 💬(0)

    断断续续跟了大半年,这一季跟下来收获颇丰,每篇文章都认真消化 跟着老师读源码,给我最大的感受是:读源码开头很难,但是只要咬牙坚持,最终那种豁然开朗醍醐灌顶的感觉和那种成就感会觉得自己花的时间是非常值得的。 在阅读第一季的时候,老师讲Redis的原理相当精彩,但是由于篇幅和难度控制的原因省去了很多细节,当时也留下了不少疑惑,通过这一季的学习学会了自己去源码找答案,再回去读第一季真的会有不同的体会,自己也会尝试去解答评论区中的留言,对我来说 这对建立自己的知识体系有很大的帮助。 最后感谢蒋老师两季的倾囊相授,这一季虽然结束,但Redis的进阶之路才刚刚开始。

    2022-03-02

  • 无痕之意 👍(0) 💬(0)

    从第1季看到第2季,虽然勉强跟到大家看到这里,不过中间很多课程都没有理解只是大概过一遍,打算最近先整理下学习的东西,过几天重新出发,重新刷一遍第1季和第2季,希望第2次看的时候能有更多的收获,谢谢大佬们的分享。 看下来到这里时已经是不一样的自己,收获满满的自己。

    2022-02-14

  • Xi 👍(0) 💬(0)

    跟着第一季到第二季,都看完一遍了,以后还会经常温故知新的。非常感谢老师的精彩讲解,收获满满,也非常感谢Kaito同学的精彩留言(每期都会看,哈哈),希望以后自己也能像Kaito同学一样从学习者变成输出者,加油,共勉!

    2021-12-06

  • Geek_de83f6 👍(0) 💬(0)

    为什么没有讲cluster的故障转移逻辑呢???

    2021-11-14

  • Milittle 👍(0) 💬(0)

    感谢老师的精彩输出 感谢Kaito

    2021-11-12