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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签