如何才能精通 Redis?

news2024/11/20 9:17:53

为什么我要讲 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【入门篇】2 # 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

说明 【数据结构与算法之美】专栏学习笔记。 为什么引入这些时间复杂度 先看下面代码 // n 表示数组 array 的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x) {pos i;break;}}return pos; }上面代码中如果没有 …

Redis序列化和java存入Redis数据序列化反序列化总结

背景&#xff1a; 最近考虑java代码数据在保存redis时&#xff0c;通常要配置序列化&#xff0c;才能保存到redis中&#xff0c;然而我们知道Redis中也有序列化&#xff08;RDB和AoF两种形式&#xff09;&#xff0c;有点混淆总结一下。 java中数据保存redis过程序列化的原因是…

图解:什么是二叉查找树?

文章目录1. 二叉查找树的概念2. 二叉查找树的实现&#x1f351; 定义节点&#x1f351; 函数接口总览&#x1f351; 构造函数&#x1f351; 拷贝构造&#x1f351; 赋值重载&#x1f351; 析构函数&#x1f351; 查找操作&#x1f345; 动图演示&#x1f345; 非递归实现&#…

【机器学习】线性回归(实战)

线性回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、构建实验所需的数据&#xff08;以下实验将基于此数据&#xff09;三、实现线性回归的两种方式方法一&#xff1a;通过直接求解得到拟合方程参数&…

Python金融风控模型案例实战大全

大家好&#xff0c;我是Toby老师&#xff0c;今天介绍 《Python金融风控模型案例实战大全》。 1.《Python金融风控模型案例实战大全》程覆盖多个核心知识点&#xff0c;包括风控建模全流程知识介绍&#xff0c;信用评分卡&#xff0c;信用评分卡知识包含个人信用评分卡和企业信…

ifconfig-显示和配置网络

ifconfig是linux中用于显示或配置网络设备&#xff08;网络接口卡&#xff09;的命令&#xff0c;英文全称是network interfaces configuring。配置网卡的IP地址语法例&#xff1a;ifconfig eth0 192.168.0.1 netmask 255.255.255.0 系统命令 语法 ifconfig [网络设备][down up…

读Go语言精进之路

主要是摘取书中&#xff0c;个人感觉比较重要的内容。 文章目录第一部分 熟知Go的一切理解Go的设计哲学使用Go语言原生编程思维写Go代码第二部分 项目结构、代码风格和标识符命名第三部分 声明、类型、语句与控制结构13 了解切片的底层原理14 了解Map实现原理并高效使用15. str…

Word处理控件Aspose.Words功能演示:在 C# .NET 中将 DOC/DOCX 转换为 PNG

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Linux系统中常见的压缩命令和特殊权限说明

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

PHP多进程(二)之pcntl_wait

上篇文章我们说到父进程应该回收子进程结束之后产生的数据,这样才会不浪费系统资源。 一个程序启动之后&#xff0c;变成了一个进程&#xff0c;进程在以下情况会退出 1&#xff09;运行到最后一行语句 2) 运行时遇到return 时 3) 运行时遇到exit()函数的时候 4) 程序异常的时…

docker搭建maven私服(nexus3),整合springboot上传下载依赖

一、前言 我们在JavaWeb开发中必不可少的就是jar包管理-maven&#xff0c;在没有maven之前&#xff0c;都是自己手动下载jar包导入到项目中&#xff0c;非常的繁琐。 maven出现之后&#xff0c;又迎来新的问题&#xff0c;对于仓库里人家发布的都可以引用下载&#xff0c;但是…

音视频面试基础题

编码原理 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?核心思想就是去除冗余信息&#xff1a; 1&#xff09;空间冗余&#xff1a;图像相邻像素之间有较强的相关性 2&#xff09;时间冗余&#xff1a;视频序列的相邻图像之间内容相似 3&#xff09…

CVPR21 - BasicVSR:简单有效的视频超分辨率Baseline

文章目录原文信息初识相知组件分析BasicVSRIconVSR部分实验回顾原文信息 原文链接 初识 相比于图像超分&#xff0c;视频超分(VSR&#xff0c;Video Super-Resolution)显然是一件更具挑战性的任务。视频超分比图像超分多了时间维度的信息、更为复杂&#xff0c;而在当时&…

结构体的声明使用及存储方式

文章目录 一、结构体的声明与使用 1、1 结构体的简单声明 1、2 结构体的特殊声明 1、3 结构体自引用 1、4 结构体变量的定义和初始化 1、5 结构体传参 二、结构体在内存中的存储方式 2、1 结构体在内存中的存储方式的引入 2、2 结构体的内存对齐 2、3 修改默认对齐数…

AcWing - 寒假每日一题2023(DAY 1——DAY 5)

文章目录一、AcWing 4261.孤独的照片&#xff08;简单&#xff09;1. 实现思路2. 实现代码二、AcWing 3400.统计次数&#xff08;简单&#xff09;1. 实现思路2. 实现代码三、AcWing 4366. 上课睡觉&#xff08;简单&#xff09;1. 实现思路2. 实现代码四、AcWing 3443. 学分绩…

程序员接私活最最完整攻略

接私活对于程序员这个圈子来说是一个既公开又隐私的话题&#xff0c;当你竭尽全力想要去接私活的时候一定做过这样的事情&#xff0c;百度搜索“程序员如何接私活”、“程序员在哪里接外包”等等问题&#xff0c;今天就送大家最完整攻略&#xff0c;千万别错过了。 做私活挣钱吗…

有趣且重要的Git知识合集(10)git stash操作

这种一般用于多分支&#xff0c;或者多人协同合作时会使用到的git命令 场景1&#xff1a; 当你在dev分支上写了很多代码&#xff0c;此时线上有bug&#xff0c;需要紧急在hotfix分支上修改&#xff0c;那直接git add提交又不太好&#xff0c;毕竟还没有开发完&#xff0c;那么…

JVM 学习笔记 内存结构

内存结构 程序计数器 作用&#xff1a;记录下一条JVM指令的执行地址 特点&#xff1a; 线程私有不存在内存溢出 虚拟机栈 每个线程运行时所需的内存称为虚拟机栈。每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xff0c;每个栈帧对应每次方法调用时占用的内存。每…

BIOS 的详细介绍

一、BIOS详解 对于不少新手&#xff0c;刷新BIOS还是比较神秘的。而对于一些BIOS相关的知识&#xff0c;不少人也是一知半解。在这里&#xff0c;我们将对BIOS作一次全面的了解。 1、什么是BIOS BIOS是英文"Basic Input Output System"的缩略语&#xff0c;直译…

NTN(三) Timing

微信同步更新欢迎关注同名modem协议笔记。这篇看下k_offset和k_mac&#xff0c;如38.300所述&#xff0c;k_offset是配置的调度偏移量&#xff0c;需要大于或等于service link RTT和Common TA之和&#xff1b;k_mac 是配置的偏移量&#xff0c;需要大于或等于 RP 和 gNB 之间的…