为什么我要讲 Redis?
已经出过这么多主题的书籍和课程了,这次我为什么要选择 Redis 这个主题呢?
那自然是因为 Redis 是我们实际开发中不可或缺的组件之一,也是目前全球最流行的 KV 数据库
。相信小伙伴们在工作中也会频繁接触到 Redis,但可能并没有量化 Redis 到底有多流行,下面我们一起来看一下,DB-Engines 这个全球知名的数据库排名网站对 Redis 的排名:
在 Complete Ranking 列表(不分类的列表)中,Redis 排名第六,排在它前面的都是关系型数据库,可以说 Redis 和它们都不是一个赛道的产品;在 Key-Value Store 这个类别中,Redis 排名第一
,你可以关注一下 2022 年 9 月份的评分,Redis 的评分已经比第二名到第五名的评分总和还要多,这其中就包括了经常与 Redis 横向对比的 Memcached。
一项技术流行起来之后,就会变成很多大厂的标配,这就需要你既能熟练使用、又能精通原理,这样写代码的时候,才能写出最佳实践,Redis 也不例外。例如,知晓 Redis 的线程模型,才能真正理解为什么在生产环境中不能用 HGETALL 命令进行查询;学习了 Lua 脚本的知识,才能基于 Redis 设计出一个可用的分布式锁;弄清了 Redis 的主从复制原理,才能理解为什么 Redis 作者要给出 Red-Lock 的方案……
也正是因为如此流行,Redis 也成为后端面试中的必问重点
,面试中只要问到缓存,必然会提到 Redis 的各种应用场景和原理,相信不少后端小伙伴深有体会。你可以看一下本小册模块二、模块三中的小节标题,就知道在其中可以找到很多面试题的答案了。
再加上 2022 年 5 月份 Redis 7.0 Release 版本正式发布,了解过 7.0 Release Note 的小伙伴应该知道这次版本变动比较大
,新增了非常多的新命令和新特性,性能方面也有非常大的提升。为了不让自己被时代淘汰,我们要赶紧学习起来,点亮 Redis 7.0 这个新技能。
Redis 学习痛点有哪些?
讲了 Redis 的千般流行、万般重要,但是回过头来,我们不得不面对一个现实问题:学习一新技能的时候,总会有一些难度,学得越深,学习曲线越陡峭!!!作为过来人,我很能理解这种感受!
不知道你在学习 Redis 的时候,是否会遇到下面的问题:
-
对 Redis 的某条命令或者某个功能,只是了解使用方式,其背后的原理不太清楚;
-
自己特别想了解 Redis 的原理和工作机制,却不知道如何入手;
-
在深入学习 Redis 某个特性的时候,找不到合适的资料,找到的资料都是只言片语的描述,或者片面的、浅尝辄止的描述,没有对一件事情全貌的描述;
-
开始深入学习 Redis 的原理之后,发现触及的知识盲区直线上升,阻力越来越大,最终放弃;
-
……
如何正确学习?
说透 Redis 7 - 杨四正 - 掘金小册核心原理剖析+源码解读+实践应用,全方位带你吃透 Redis 7。「说透 Redis 7」由杨四正撰写,979人购买https://s.juejin.cn/ds/kaY9xnj/
要想解决这些问题,我们需要正本溯源,先来解决一下学习思路的问题。因为只有掌握了正确的学习思路和方法,我们后续的努力才能达到事半功倍的效果。
需要说明的是,下面介绍的学习思路不光是针对本小册介绍的 Redis 技术本身,我们其他的学习技术也都是适用的,比如,一个框架、组件、某个新知识领域等。
我个人比较喜欢务实的方式来看待技术,对技术的深度分为四层
(也对应我们简历里面的描述),这也是我们学习一项技术的四个过程,只有知道自己身处何处,才能知道下一步该往哪里走。
第一层(“知道”层面):这个技术是什么,干什么用的。最基本目标就是在跟其他同学或面试官聊天、吹牛的时候,能聊下去。我们对绝大多数的技术,只要了解到这个层级就可以了,尤其是自己岗位涉及不到的技术,比如,一个后端程序员,只要知道前端的 Vue.js、AngularJS 等框架是干什么的,就可以了。达到了这个层面之后,你就可以在简历上写“知道某某技术” ,不过简历寸土寸金,一般不会有人写“知道”层面的内容。
第二层(“了解、熟练”层面):这个技术是怎么用的,然后怎么应用到我们的工作里了。这个阶段最基本的目标就是知道这个技术常用的 API 是什么,然后怎么结合业务需求完成工作。这也是很多同学学习一个技术的时候,最常达到的一个状态。毕竟工作嘛,面向人民币编程,不寒碜,完成工作拿到对应的薪资,就是工作的核心目标之一。达到了这个层面的要求,你就可以在简历上写“了解某某技术”。
第三层(“熟悉”层面):为什么。这个“为什么” 需要从几个更广的视角去思考。比如说,要结合具体的背景去思考,为什么会这个技术的出现,解决了哪些痛点?还要结合业务场景去思考,有很多同类型的技术,为什么在有的业务场景下要选择 A 不选 B?都说成年人都要,但是程序员的技术选型就要各种权衡、取舍,做各种对比的表格或者文档,然后开会来讨论技术选型,还会被各种挑战。所以,从尽可能多的角度去思考“为什么”,是我们技术进阶、职位晋级的关键之一 。达到了这个层面的要求,你就可以在简历上写“熟悉某某技术”。
第四层(“精通”层面):这个技术底层原理是什么,运行机制是什么样的。这个层面我们需要深入到技术细节,刨根问底,弄懂某项技术的底层原理的关键所在,最好还能站在最底层向上看,总结相同或类似原理的技术点,形成自己的一套技术体系。达到了这个层面之后,你就可以在简历上写“精通某某技术”了。
介绍完这四层的含义之后,我们再一起来看一下到底该如何“通关”这四个层面。
第一层(“知道”层面): 要做到这个层面,我们只需要浏览一下官方文档中的 Introduction 和 Get Start 两部分。以 Redis 为例,就是这两部分内容 Introduction to Redis、Getting started with Redis 。当然,再花半小时搜索一下行业内对该技术的应用,也是不错的选择。
第二层(“了解、熟练”层面): 要做到这个层面,我一般推荐做三件事情。
- 第一件事是将官方文档的剩余部分浏览一遍,然后重点阅读自己需要的部分。还是以 Redis 为例,我是一个 Java 后端研发,Redis 官方文档中我需要重点看 Redis 的数据结构(Data Types)以及如何使用 Redis(Manual)两部分,暂时可以不关注 Tools、Library 这几部分的内容。
-
第二件事是项目实战,最好是在自己的工作项目中使用到我们在第一个步骤学到的内容,如果没有工作项目,可以考虑去找开源项目或者模拟项目,比如在项目中引入 Redis 做缓存。
-
第三件事是总结自己的项目实战经验,摸清楚这项技术中最常用的部分是什么,最佳实践是什么,有哪些坑不能踩。当然,从其他途径得到的经验,也同样重要,比如组内分享、社区讨论,关键是要经过自己实践。
第三层(“熟悉”层面)和第四层(“精通”层面): 这两个层面可放到一起做。一般会先找到对标技术,然后达到前两个层面的要求,对两项技术做到熟练的程度。接下来,结合自己总结的实战经验,对两项技术或者其中的某些技术点做横向对比。在对比过程中,又会找到很多角度去理解两项技术,也促使我们去探索两者的实现原理;弄清原理之后,反过来也会帮我们更好地比较两者的优缺点,更深刻地理解“为什么选 A 不选 B” 的问题。
探索一项技术的底层原理,是技术人花费最多精力的地方,下面我就简单分享一下我探索 Redis 原理的一些经历。
首先,我个人只会对比较感兴趣的技术或者非常流行的技术,才做深入的研究,毕竟人生时间有限。确定了要深入的技术点,就要去学习各路大神写的技术内幕、技术原理的帖子,甚至研究源码。这个过程也是最有意思的一件事情,我的一般步骤是:假想自己会如何实现这个功能,然后带着自己的方案,和那些原理分析帖“对答案”,这样可以低成本、高效率地锻炼自己的系统设计能力。但是这个过程中,会碰到原理帖比较旧,或者原理帖与我的假想实现不一样的情况,这个时候就会去翻翻源码,佐证自己的想法。当然,很多时候都是打自己的脸,但是自己被打脸的场景是真的记得牢!
可能有小伙伴会说,看源码效率太低了,容易掉到实现细节里面去。确实有这样的问题,但是这种带着问题去翻源码的效率是很高的,而且往往会有意想不到的收获。另外,我们要辩证地看问题,看源码带来的好处真心很多。
- 面试的时候一定不会问的是源码细节,但是一定会问源码级别的原理,这是区分程序员是否真正精通一项技术的重要手段。
- 掌握了一个框架或者组件的底层原理之后,即使切换成其他对标的框架组件,原理其实也大同小异的,学习成本很低。
- 学习底层的源码设计思想,这都是优秀的解决方案,现成的“黄金宝库”。我们自己做系统架构的时候,也可以进行参考,有助于做出合理的系统架构设计。
- 我们定位问题的时候,其实是大胆假设、小心求证的过程。理解了原理之后,我们才能提出合理的假设和猜测。
最后,跟小伙伴们强调一点:弄懂了技术的原理之后,一定要重新审视第二层和第三层的内容。这个时候,架构设计上有项目实战的支撑、技术选型上有横向对比的思考、技术深度上有源码级别的理解
,你就会有种 “站在最高处,窥见最全貌”的感觉
。
我如何设置这本小册?
介绍了基本的学习思路之后,我们再来聊一下本小册要介绍 Redis 7 的哪些内容。
本小册也是按照上述四层学习法
进行设置的。其中,第 0 模块解决的是“知道”层面的问题,第 1 模块解决的是“熟练”层面的问题,剩余的模块重点在解决“精通”层面的问题,也会涉及 “熟悉” 层面的问题。针对 Redis 中的每个技术点,也尽我所能按照四层学习法进行介绍。
我这里画一个思维导图,对应着本小册的课时设置,将 Redis 7 全部的知识点分成了十大模块。悄悄说一句,这应该也是 国内第一本系统介绍 Redis 7 的课程
了。
关于这个模块 0,其实设置的初衷就是,考虑到各个小伙伴对 Redis 掌握程度并不一致,肯定有小伙伴是刚接触 Redis,另外也为了让我们学习起始能有个平缓的学习曲线,这里会介绍一些 Redis 的基础知识作为我们的先导入门。比如,Redis 的由来、经常被面试官问到的 Redis 和 Memcache 这两种常用缓存技术的选型问题;要想读懂 Redis 里面关键的代码实现,需要先有一点 C 语言基础,所以我还帮助不熟悉 C 语言的小伙伴做了一个快速入门讲解;最后还介绍了 Redis 7 环境搭建以及 Redis 7 PR 阅读方式,这对于你后续的理解和上手实践很重要。
这些都属于我们在学习 Redis 之前最基本的知识,对这些早就掌握的小伙伴,可以直接跳过,进入到后面的知识讲解中。
我们本小册的十大模块内容设置情况如下。
模块一:实战应用篇。主要是针对 Redis 实践经验较少的小伙伴。这一模块会和你一起学习 Redis 中五大类结构的常用命令,以及这五类结构在实战场景中的使用。
模块二:数据结构篇。主要讲解 Redis 中核心的数据结构,这些数据结构是模块一中那五大类结构的底层实现,是 Redis 非常重要的一部分知识点。除此之外,还会结合 Redis 7 的相关 PR,带领你了解 Redis 7 在数据结构方面的改进。
模块三:内核解析篇。主要侧重 Redis 内核的运行原理,重点解析 Redis 的 I/O 模型、线程模型,还会深度剖析 Redis 从接收请求到返回响应的全流程。
模块四:命令解析篇。结合前面模块的内容,带你了解 Redis 如何组合多种底层的数据结构,来支持五大类常用命令。当然,这个学习过程也会用到 Redis 内核知识,需要了解 Redis 处理请求的全流程。
模块五:持久存储篇。重点介绍 Redis 提供的 RDB 和 AOF 两种持久化方式,其中不仅会介绍两种持久化的基本原理和实现,也会结合 Redis 7 的 PR 分析 Redis 7 带来的优化。
模块六、七、八,侧重于分布式 Redis 的内容。首先分别在 Redis 主库和从库视角下,分析主从同步的实现原理,然后介绍 Sentinel 模式下如何实现监控和自动故障转移等功能,最后重点介绍 Redis Cluster 这种主流的分布式 Redis 存储方案。
模块九:生产者-消费者模式篇。 重点介绍 Redis 作为消息队列,实现生产者-消费者模式的几种方案,其中还会介绍 Redis 7 中的 Shard Pub/Sub 新方案。
模块十:扩展能力篇。 重点介绍 Redis 扩展方面的内容,其中会涉及到 Lua 脚本的扩展,以及 Redis 7 带来的 Functions 新特性。
寄语
相信在学习完本小册之后,你就可以彻底精通 Redis 7,成为你工作圈中的一名 Redis 技术专家,树立“技术大拿”的形象。最后,我非常期待和你一起点亮 Redis 7 的技能树,成为工作、晋级、面试中最亮的那颗星。
在学习过程中,如果你有什么问题,或者有好的经验可以分享,欢迎你在留言区与我分享,我们一起交流,共同进步。
说透 Redis 7 - 杨四正 - 掘金小册核心原理剖析+源码解读+实践应用,全方位带你吃透 Redis 7。「说透 Redis 7」由杨四正撰写,979人购买https://s.juejin.cn/ds/kaY9xnj/