Redis源码学习(20),学习感悟_redis源码有必要看吗-程序员宅基地

技术标签: Redis源码学习  Redis源码  学习感悟  

  最近学习Redis源码也有半个月的时间了,有不少收获也有不少感悟,今天来好好聊聊我学习的感悟。

1 发现问题

  人非圣贤孰能无过,只要是人难免会犯错,回顾我之前的学习历程,其实是可以发现不少的问题,大概有学习方式混乱、流于形式、忘记、不深入、精神面貌欠佳、敷衍了事、收获不足、不够求真、无趣。

  1. 学习方式混乱
  2. 学习动力不足

  下面具体分析下这些问题,看下这些问题究竟是什么,为什么会产生这些问题,那又怎么解决这些问题。

2 学习方式混乱

2.1 缺少方向感

  Redis的代码非常多,从哪里学,怎么学都是问题,如果没有一个好的学习规划的话,则很容易失去学习方向。

  刚开始学习Redis源代码的时候,我是一腔热血,也没管那么多,想着先开始再说,直接就下载源代码开始阅读起来,反正想着就从最简单的开始,然后慢慢的读下去,其实这样也没有什么大问题,但是这样容易失去大方向,对Redis源代码的组织结构不清楚的话,犹如在走迷宫一样。

  为了避免这样的问题加深,所以在后面我会重新审视下Redis源代码的组织结构分布,并且绘制一幅Redis源代码的地图,这样不仅能够增加对Redis源代码的组织结构的了解,也能给自己指引一个明确的方向,今天学习哪里,下一步学习哪里。

2.2 整体与局部

  整体与局部的问题其实就和盖房子一样,盖房子的时候要先把地基和框架做起来,然后再铺上水电,最后再来装修。那么学习Redis源码也是一样,整体就先搞清楚大概那些文件是干什么的,那些方法是干什么的,有了一个整体的了解,在把一些细节逐个攻破。

  不过这样也是有一个问题,就是整体与局部的界限的把握,如果过于整体的学习,可能只是走了个形式;如果过于局部的学习,可能深陷其中。

  为了避免这个问题,还是要定义一个清晰的界限,整体到哪个范围就可以,到哪个范围就是局部,只要清楚这个界限,就能做到游刃有余,而不是一直纠结这个要不要深入研究,要不要学习。

3 学习动力不足

3.1 老目标分析

  其实学了这半个月,有时也会产生自我怀疑,我学习Redis源码究竟是为了什么,我学这个到底有没有用,我还要不要坚持下去。

  先来回顾一下我之前学习Redis源码的目标都有哪些。

  1. 工作中Redis接触的比较多
  2. 可以系统性地学习一门知识
  3. 增强阅读源码的能力
  4. 学习遇到瓶颈,想突破瓶颈
  5. 一探究竟

  看起来貌似都没啥大问题,但其实现在看起来这些目标多多少少是不够强有力的,如果没有一个强有力的目标来支撑自己,仅仅是靠以上目标还是难以走下去,肯定还需要一个足够大的目标和动力去驱动我做这件事情。

3.1.1 工作中Redis接触的比较多

  这一条其实是不够有说服力的,工作中虽然用的很多,但是还不够促使我要去阅读代码,基本只要我能够使用Redis就可以胜任工作,所以这条不行。

3.1.2 可以系统性地学习一门知识

  这一条只能说中规中矩,最近这些年确实学了很多乱七八糟的东西,但是都没有系统地学习一门东西,与其说系统性地学习一门知识,不如说是借此次机会,将自己所有学习的知识系统化,将所有的知识点串联起来。所以这条可以更正为将自己的知识的系统化。

3.1.3 增强阅读源码的能力

  这一条怎么说呢,也有点差强人意,因为阅读源码的能力确实是一项不错的能力,但并不是一项非常必要的能力,做与不做貌似都没有太大的影响,当然如果想提高自己的话,确实还是可以尝试增强这项能力。

3.1.3 学习遇到瓶颈,想突破瓶颈

  这条简单一点的说,就是最近自己不知道学啥了,但是不学点东西又感觉有点荒废时间,然后也不知道从哪里听说学习源码可以提升自己的能力,具体能提升啥能力咱们也不清楚,反正能提升能力那就来呗,所以综合分析起来,这条目标的动力也不够强劲。

3.1.4 一探究竟

  每个人都有好奇心,只是好奇心的程度不同,可能我的好奇心就比较强,使用过Redis就想知道它是怎么实现的,话又说回来了,那我使用过Mysql为什么不想去阅读它的源码,或者其他的软件。

  这里其实就要深挖更深层次的需求,弄清楚自己到底想要什么、想做什么,是什么原因让自己必须要对Redis一探究竟,搞清楚它是怎么实现的,只有弄清楚这一点,才能坚定自己的目标,并且提供源源不断的学习动力。

3.2 新目标分析

3.2.1 提升能力

  其实之前的老目标中好几条其实都可以归结于提升能力,很简单我们学习任何东西都是要提升自己的能力,不管是什么能力,只要提高了总会有收获和提升,在没有合适的提升能力的方法或者渠道的话,那么就找一个合适的方式,我觉得学习Redis源码可以提升我的能力,那么我就尝试这个方式。

  那么说到提升能力有什么用,简单一点就是升职加薪,赚更多的钱买更多自己想买的东西。

  说的长远一点,提升自己的能力,可以研究更有难度、更高级的东西,何尝不是一件有趣的事情。

3.2.2 动手实现一个中间件

  其实当我们用了很多中间件,并且去研究这些中间件的时候,可以发现很多底层逻辑和实现方式,大差不差,那为什么我们自己不去实现一个简单的中间件玩一玩,可能有人说重复造轮子没意义,但是只要我们自己觉得有意义就行,自己实现一个中间件并能跑起来难道不是一件非常有意义的事情。

  那为什么要选择Redis呢,原因是Redis是一款比较成熟的中间件,而且性能也是非常不错,并且是开源的,源代码很容易找到,所以选择学习Redis源码是一个很合适的方案。

  我们学习Redis源码可以了解服务端、客户端、网络通信、IO多路复用、主从、哨兵、集群、数据结构、内存等相关知识,但是学习只是学习,假如我们能把学习到的知识用于实践之中,那么这样才能把知识融会贯通,上升到一个更高的层次。

  可能讲到这里,很多人就打退堂鼓了,本身学习Redis源代码就是一个很庞大的工程耗时耗力,如果再加上要自己实现一个和Redis一样的中间件,工程量更是巨大,其实这里大家可能有一些误区,我们并不是要照搬人家的功能,也不是要实现和人家一模一样,我们只是去实现一个可以把所有知识点体现出来的简易版Redis即可,所谓学到就是赚到。

  如果有了这个目标,我们就有了足够的动力去学习Redis源码,因为知己知彼百战百胜,只有足够了解Redis源码,才能游刃有余的去实现一个简易版的Redis,否则就是非常被动的抄一抄人家的代码效果不大。

4 慢下来

4.1 走马观花

  最近仔细想想自己半个月的学习过程,里面有很多时候都是走马观花,为了快点学习完,有一种敷衍了事赶进度的感觉,导致有一些学习不够细致,忽略了很多东西,也少了许多思考。半个月学习完五种数据类型的源代码,说快说慢,还是看自己每天投入了多少时间在上面。

  本来想着学习完就进入下一阶段的学习,但是仔细想想前面大部分的学习都有点草率,就不能在这种状态下草率地进入下一阶段的学习,还是要先把之前的学习内容查漏补缺后再考虑后面的事。并且之前很多篇学习博客的质量也要好好提高一下,完善每一篇文章才能提高自己。

  查漏补缺属于亡羊补牢,为了避免这种问题的发生,还是要调整好心态,学习源代码本身就是一件耗时比较久的事情,企图短时间内就完成它是不太可能的,所以要想清楚自己要在一定时间内学习完它,还是要把它学习好,这完全是两件不同的事。

  对于之前的状态,我可以说是想在一定时间内学习完它,但忽略了学习的细节和质量,所以以后就不给自己设定时间期限,认真学习好每一个方法和细节,做好每一件小事,才能把一件事情整体做好。

  最近看到一句话其实非常好,这里也分享给大家,所有看起来很爽的东西,都是瞬间的感觉,而人类真实的快乐一定是很久的努力。

4.2 不够专注

  前有走马观花,后有三心二意,我在学习的过程当中容易被各种乱七八糟的事情打断,例如聊天、看手机、听音乐、或者看下抖音休息一下。就很难静下心来去专注的学习源码,这也是导致学习质量下降的原因之一。

  所以以后在学习源码的时候,尽量把一些乱七八糟的事先处理好,把手机也丢一边,学习就学习不想其他的事情,慢慢培养自己的专注力。

5 收获

  虽然上面分析了学习中发生的问题,但也不代表我们这半个月完全在打酱油一无所获,总体而言还是有很多收获的。

5.1 熟悉代码

  虽然刚开始不熟悉Redis代码,但是天天看、天天分析,一遍两遍总会熟悉的,这半个月来看了不少代码,也分析了不少代码,渐渐地对Redis很多方法越发的了解,以及它整体流程和一些通用逻辑,方法命名规律。

5.2 了解命令实现原理

  这半个月主要学习的内容是我们常用的一些Redis命令,通过学习掌握了不少命令的实现方式,以后在使用这些命令的时候,脑海中也会有印象,可能灵光一闪原来是这样实现的。

5.3 发现自己的不足

5.3.1 对Redis命令不够了解

  学习Redis源代码之前,觉得自己应该对Redis挺了解的,并且平常用的命令也挺多,但是到了实际学习之后发现自己对Redis很多命令其实并不了解,甚至很多命令都不知道。

5.3.2 对C语言不熟悉

  虽然大学的时候很认真的学习了C语言,但是毕业之后也一直没有怎么用过,觉得自己应该很了解了,结果学习源码之后发现很多语法自己都不太清楚,造成了一定的阅读障碍,所以要花点时间把C语言的一些语法重新温习一下,并巩固一下没有掌握的知识。

5.3.3 缺少思考

  学习是要经过思考,经过一番大脑的纠缠,才能将所学的东西深刻印在脑海中,如果只是简单的过一下表面的东西,那么很多东西犹如浮云,转瞬间就忘记,那么这样的学习显然是没有好的效果的。经过这次学习发现自己就缺少思考,很多东西没有提出自己的想法,所以在以后的学习里会加入一个思考环节,专门提出一些自己的想法或者疑问。

6 总结

6.1 想法

  经过这两天的反思和总结,想清楚了不少东西,也算是不错。

  1. 做正确的事,而不是做更多的事。
  2. 学习要追求质量,而不是数量。
  3. 想清楚自己真正想要什么,再去追求自己想要的。
  4. 做事要认真专注,而不是敷衍了事。
  5. 要学会把一件事情变得有趣。

6.2 接下来的行动

  经过一番思考,接下来的行动,有了一个新的计划。

  1. 回顾之前的学习内容,查漏补缺。
  2. 回顾以往的学习博客,完善一些细节,并总结写的不好的地方。
  3. 重新梳理学习计划。
  4. 温习C语言的基础知识。
  5. 绘制Redis源码地图,熟悉一下整体的结构。
  6. 进行下一步学习计划,数据类型对应的几种数据结构。

End

  前路漫漫,希望大家一起加油,鼓起勇气去追寻自己的向往。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kelinfeng16/article/details/124554839

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签