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

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法