最近学习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

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

Redis源码学习(20),学习感悟相关推荐

  1. Redis源码解析——有序整数集

    有序整数集是Redis源码中一个以大尾(big endian)形式存储,由小到大排列且无重复的整型集合.它存储的类型包括16位.32位和64位的整型数.在介绍这个库的实现前,我们还需要先熟悉下大小尾内 ...

  2. Redis源码阅读,从入门到放弃

    作为后端工程师,我们在面试和工作中都会用到 Redis,特别是大型互联网公司面试时,不仅要求面试者能简单使用 Redis,还要求懂 Redis 源码层面的实现原理,具备解决常见问题的能力.可以说,熟练 ...

  3. Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式

    Redis源码解析(1) 动态字符串与链表 Redis源码解析(2) 字典与迭代器 Redis源码解析(3) 跳跃表 Redis源码解析(4) 整数集合 Redis源码解析(5) 压缩列表 Redis ...

  4. redis源码学习笔记目录

    Redis源码分析(零)学习路径笔记 Redis源码分析(一)redis.c //redis-server.c Redis源码分析(二)redis-cli.c Redis源码剖析(三)--基础数据结构 ...

  5. 阅读 redis 源码,学习缓存淘汰算法 W-TinyLFU

    所有 IT 从业者都接触过缓存,一定了解基本工作原理,业界流行一句话: 缓存就是万金油,哪里有问题哪里抹一下 .那他的本质是什么呢? 上图代表从 cpu 到底层硬盘不同层次,不同模块的运行速度,上层多 ...

  6. 10年大厂程序员是如何高效学习使用redis的丨redis源码分析丨redis存储原理

    10年大厂程序员是怎么学习使用redis的 1. redis存储原理分析 2. redis源码学习分享 3. redis跳表和B+树详细对比分析 视频讲解如下,点击观看: 10年大厂程序员是如何高效学 ...

  7. 为什么C/C++程序员都要阅读Redis源码之:Redis学习事件驱动设计

    0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...

  8. c++ 多线程 类成员函数_为什么我说C/C++程序员都要阅读Redis源码之:通过Redis学习事件驱动设计

    0. 为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你 ...

  9. 【Redis学习笔记】2018-05-30 Redis源码学习之Ziplist、Server

    作者:施洪宝 顺风车运营研发团队 一. 压缩列表 压缩列表是Redis的关键数据结构之一.目前已经有大量的相关资料,下面几个链接都已经对Ziplist进行了详细的介绍. http://origin.r ...

最新文章

  1. 2022年想成为软件测试工程师,这个学习路线收藏起来
  2. 年过35岁的程序员都去哪儿了
  3. MFC动态按钮的创建及其消息响应 和 自定义消息
  4. Oppoa7手机怎么录视频 oppo手机屏幕录制
  5. Entity framework WhereInExtension
  6. mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)
  7. 试炼之石:Performance
  8. fastboot usb 驱动相关
  9. MII2RGMII IP核使用设计举例
  10. nps是什么、怎么计算、有什么用
  11. 全球及中国钢铁行业投资产量趋势及营销盈利模式研究报告2021版
  12. Ansys多核仿真报错解决办法
  13. android tf卡 修复工具,如何修复/格式化损坏的安卓手机SD卡-万兴恢复专家
  14. 去除android手机信号图标
  15. k8s dashboard安装
  16. JavPlayer 109 1.09 AI破坏马赛克
  17. 1.1机器学习和深度学习综述(百度架构师手把手带你零基础实践深度学习原版笔记系列)
  18. Word论文转化成静态文本
  19. android Jetpack之Lifecycle的使用
  20. 【Opencv基础学习】 VideoWriter打开本地摄像头并保存mp4格式视频

热门文章

  1. java super父类的父类_java super关键字,super访问父类成员详解
  2. 【TensorFlow2.0】如何搭建网络模型?
  3. 138种QQ空间透明flash
  4. STM32F103固件库源码解析——RCC_APB2PeriphClockCmd
  5. 转-CNN模型的压缩与加速算法综述
  6. 常见客户SEO问题解答:网站关键词优化到底怎么做?
  7. 【行业动态】福建服装品牌如何完成差异化战略?
  8. 通过NASA卫星,带你看真实的亚马逊火灾
  9. 闽高校计算机等级考试试题,闽高校计算机等级考试信息技术选择题含答案确定书中页码版...
  10. python语言中代码注释可以使用_以下选项中,Python语言中代码注释使用的符号是: ( )...