Redis源码剖析与实战

Redis源码剖析与实战 / 深入源码底层实现,轻松通关Redis面试

蒋德钧 (中科院计算所副研究员)
  • 课程目录
  • 课程介绍
  • 在线阅读:开篇词 | 阅读Redis源码能给你带来什么?

    阅读源码是一个很辛苦的过程,尤其是面对像Redis这样的系统软件。不过掌握了阅读方法,进而养成了阅读习惯后,你就能从源码中掌握Redis的各种实现细节,建立对Redis的全面认识。这样一来,你就能成为一名Redis专家。

  • 01 | 带你快速攻略Redis源码的整体架构

    理解代码结构,可以为我们提供Redis功能模块的全景图,并方便我们快速查找和定位某个具体功能模块的实现源码,这样也有助于提升代码阅读的效率。

  • 02 | 键值对中字符串的实现,用char*还是结构体?

    字符串的实现需要考虑操作高效、能保存任意二进制数据,以及节省内存的需求。而Redis中设计实现字符串的方式,就非常值得你学习和借鉴。

  • 03 | 如何实现一个性能优异的Hash表?

    Redis为我们提供了一个经典的Hash表实现方案。针对哈希冲突,Redis采用了链式哈希;对于rehash开销,Redis实现了渐进式rehash设计,进而缓解了rehash操作带来的额外开销对系统的性能影响。

  • 04 | 内存友好的数据结构该如何细化设计?

    Redis数据结构在面向内存使用效率方面的优化,主要包括两方面的设计思路:一是内存友好的数据结构设计;二是内存友好的数据使用方式,这两方面的设计思路和实现方法是具有通用性的

  • 05 | 有序集合为何能同时支持点查询和范围查询?

    Sorted Set能支持范围查询,是因为它的核心数据结构设计采用了跳表,而它又能以常数复杂度获取元素权重,是因为它同时采用了哈希表进行索引。

  • 06 | 从ziplist到quicklist,再到listpack的启发

    在计算机系统中,任何一个设计都是有利有弊的。为了应对ziplist的问题,Redis先是在3.0版本中设计实现了quicklist,又为了减少内存开销,并进一步避免ziplist连锁更新问题,在5.0版本中设计实现了listpack结构。

  • 07 | 为什么Stream使用了Radix Tree?

    Radix Tree这个数据结构的最大特点,是适合保存具有相同前缀的数据,从而实现节省内存空间的目标,以及支持范围查询。

  • 08 | Redis server启动后会做哪些操作?

    Redis server的启动过程从基本的初始化操作,到命令行和配置文件的参数解析设置,再到初始化server各种数据结构,以及最后的执行事件驱动框架,这是一个典型的网络服务器执行过程,你在开发网络服务器时可以作为参考

  • 09 | Redis事件驱动框架(上):何时使用select、poll、epoll?

    学习IO多路复用的机制和使用流程,其实就是掌握Redis事件驱动框架的基础。

  • 10 | Redis事件驱动框架(中):Redis实现了Reactor模型吗?

    Reactor模型是高性能网络系统实现高并发请求处理的一个重要技术方案。掌握Reactor模型的设计思想与实现方法,除了可以应对面试题,还可以指导你设计和实现自己的高并发系统。

  • 11 | Redis事件驱动框架(下):Redis有哪些事件?

    本质上来说,事件驱动框架是基于操作系统提供的IO多路复用机制进行了封装,并加上了时间事件的处理。这是一个非常经典的事件框架实现,我希望你可以学习并掌握好它,然后用在你自己的系统开发中。

  • 12 | Redis真的是单线程吗?

    Redis是单线程程序吗?事实上,Redis server启动后,它的主要工作包括接收客户端请求、解析请求和进行数据读写等操作,是由单线程来执行的,这也是我们常说Redis是单线程程序的原因。

  • 13 | Redis 6.0多IO线程的效率提高了吗?

    在Redis 6.0版本中,Redis在执行模型中进一步使用了多线程来处理IO任务,目的就是充分利用当前服务器的多核特性,使用多核运行多线程,让多线程帮助加速数据读取、命令解析及数据写回的速度,提升Redis整体性能。

  • 14 | 从代码实现看分布式锁的原子性保证

    多IO线程实际并不会加快命令的执行,而是只会将读取解析命令并行化执行和写回结果并行化执行,并且读取解析命令还是针对收到的第一条命令。实际上,这一设计考虑还是由于网络IO需要加速处理。

  • 15 | 为什么LRU算法原理和代码实现不一样?

    一个算法的基本原理和算法的实际执行,在系统开发中会有一定的折中选择,主要就是因为我们需要综合考虑所开发系统在资源和性能方面的要求,避免严格按照算法实现带来的资源和性能开销。

  • 16 | LFU算法和其他算法相比有优势吗?

    从LFU算法的实现代码来看,当我们自己实现按访问频率进行操作的软件模块时,Redis采用的这两种设计方法:访问次数按时间衰减和访问次数按概率增加,其实是一个不错的参考范例。

  • 17 | Lazy Free会影响缓存替换吗?

    惰性删除是Redis 4.0版本后提供的功能,它会使用后台线程来执行删除数据的任务,从而避免了删除操作对主线程的阻塞。学完惰性删除在缓存淘汰时的应用,当你遇到Redis缓存内存容量的问题时,就多了一条排查思路了。

  • 期中测试 | 这些Redis源码知识,你都掌握了吗?

    一起来检测下学习成果吧!

  • 期中测试题答案 | 这些问题你都答对了吗?

    一起来看看,这些问题你都答对了吗?

  • 18 | 如何生成和解读RDB文件?

    创建RDB文件的三个入口函数分别是rdbSave、rdbSaveBackground、rdbSaveToSlavesSockets,它们在Redis源码中被调用的地方,也就是触发RDB文件生成的时机。

  • 19 | AOF重写(上):触发时机与重写的影响

    因为AOF重写操作实际上需要遍历Redis server上的所有数据库,把每个键值对以插入操作的形式写入日志文件。而日志文件又要进行写盘操作。所以,Redis源码使用子进程来实现AOF重写,从而减少了对Redis整体性能的影响。

  • 20 | AOF重写(下):重写时的新写操作记录在哪里?

    AOF重写过程中主进程收到的新写操作并不会被遗漏,从而就尽可能地保证重写日志具有最新、最完整的写操作了。

  • 21 | 主从复制:基于状态机的设计与实现

    如何才能高效地实现主从复制呢?Redis是采用了基于状态机的设计思想,来清晰地实现不同状态及状态间的跳转。这种设计和实现方法其实非常重要,它可以避免我们在处理不同状态时的逻辑冲突或遗漏。

  • 22 | 哨兵也和Redis实例一样初始化吗?

    哨兵实例和Redis实例使用的是相同的入口main函数,但是哨兵实例在运行时使用的配置项、运行时信息、支持的可执行命令、事件处理和Redis实例有所区别。

  • 23 | 从哨兵Leader选举学习Raft协议实现(上)

    对于哨兵Leader选举来说,它参考了Raft协议,但你需要注意的是,哨兵在正常运行时并不像Raft协议那样区分了三种节点类型,而是所有哨兵都是对等的。

  • 24 | 从哨兵Leader选举学习Raft协议实现(下)

    今天这节课,我接着来给你介绍sentinelHandleRedisInstance函数执行过程中的剩余操作,分别是检测主节点是否客观下线、判断是否需要执行故障切换,以及需要故障切换时的哨兵Leader选举的具体过程。

  • 25 | Pub/Sub在主从故障切换时是如何发挥作用的?

    Redis实现的发布订阅通信方法是提供了频道的方式,让要通信的双方按照频道来完成消息交互。当客户端需要了解哨兵的工作进度或是主节点的状态判断时,就可以通过订阅哨兵发布消息的频道来完成。

  • 加餐1 | Redis性能测试工具的使用

    redis-benchmark是常用的Redis性能测试工具,它可以通过设置并发客户端、总操作数、value大小、key的随机性、批量发送等配置项,来给Redis server施加不同的压力。

  • 加餐2 | 用户Kaito:我是怎么读Redis源码的?

    掌握读源码的能力,是我们从只懂得如何使用Redis,到精通Redis实现原理的成长之路上,必须跨越的门槛。

  • 加餐3 | 从Redis到其他键值数据库的学习体会

    无论是Redis还是持久化键值数据库,它们的作用在当前大数据、云计算的场景中越来越重要,希望你能通过这门课程的学习,先把Redis掌握好,再来学习这些有代表性的持久化键值数据库,来扩大你的知识面和技术栈的深度。

  • 加餐4 | RDB和AOF文件损坏了咋办?

    如果在写盘过程中发生了错误,就会导致AOF或RDB文件不完整。为了应对这个问题,Redis就专门实现了针对AOF和RDB文件的完整性检测工具,也就是redis-check-aof和redis-check-rdb两个命令。

  • 用户故事 | 曾轼麟:世上无难事,只怕有心人

    世上无难事,只怕有心人。虽然Redis源码的学习是一个持续且漫长的过程,需要付出时间去坚持,我们可能一开始会备受打击,但是一旦学有所成,它带给我们的收获,一定是非常有价值的。

  • 26 | 从Ping-Pong消息学习Gossip协议的实现

    Gossip协议实现的关键有两个,一个是要通过Ping-Pong消息发送节点自身的信息,以及节点已知的其他节点的信息,另一个关键就是要随机选择节点发送。

  • 27 | 从MOVED、ASK看集群节点如何处理命令?

    对于分布式集群来说,Redis Cluster设计实现的请求重定向机制是一个不错的参考示例。其中,MOVED和ASK两种重定向情况,就充分考虑了数据正在迁移的场景,这种设计值得我们学习。

  • 28 | Redis Cluster数据迁移会阻塞吗?

    当集群节点承担的负载压力不均衡时,或者有新节点加入或是已有节点下线时,那么,数据就需要在不同的节点间进行迁移。所以,如何设计和实现数据迁移也是在集群开发过程中,我们需要考虑的地方。

  • 29 | 如何正确实现循环缓冲区?

    在开发后端数据系统时,会面临数据同步的问题。在应对这个问题时,缓冲区的设计与实现是一定要考虑的。而循环缓冲区是缓冲区开发的一个常用技巧,所以,我们要掌握如何实现循环缓冲区,尤其是实现难点的解决方法。

  • 30 | 如何在系统中实现延迟监控?

    Redis源码中实现的延迟监控框架主要是关注导致延迟增加的事件,它记录的延迟事件,也是和Redis运行过程中可能会导致运行变慢的操作紧耦合的。

  • 31 | 从Module的实现学习动态扩展功能

    Redis从4.0版本开始,就提供了扩展模块的功能。这些扩展模块以动态链接库(so文件)的形式加载到Redis中,我们可以基于Redis来新增功能模块。

  • 32 | 如何在一个系统中实现单元测试?

    对于一个包含多功能模块的系统来说,我们该如何进行单元测试呢?Redis源码中针对其主要功能模块,比如不同数据类型操作、AOF和RDB持久化、主从复制、集群等模块,提供了单元测试的框架。

  • 答疑1 | 第1~6讲课后思考题答案及常见问题答疑

    很多优秀的系统设计,其实背后就是计算机系统中很朴素的设计思想。如果你能有意识地积累这些设计思想,并基于这些思想去把握自己的系统设计核心出发点,你就会对系统的设计和实现有一个更好的全局观。

  • 答疑2 | 第7~12讲课后思考题答案及常见问题答疑

    Redis就像一个小宝藏一样,我们可以从中学到从编程开发、到系统管理、再到系统设计等多方面的知识。希望你能在阅读Redis源码的道路上充分挖掘这个宝藏,充实自己的知识财富。

  • 答疑3 | 第13~18讲课后思考题答案及常见问题答疑

    从绝对值上来看,系统调用开销并不高,但是对于像Redis这样追求高性能的系统来说,每一处值得优化的地方都要仔细考虑。避免额外的系统开销,就是高性能系统开发的一个重要设计指导原则。

  • 答疑4 | 第19~24讲课后思考题答案及常见问题答疑

    希望你通过这节课的内容,可以再回顾下Redis哨兵实例的代码,并进一步了解题目解答中涉及的开发知识和技术。

  • 答疑5 | 第25~32讲课后思考题答案及常见问题答疑

    你可以根据今天讲解的这些思考题的解答思路,去进一步了解下哨兵实例命令和普通实例命令的区别、Redis Cluster对事务执行的支持情况,以及函数式编程方法在Redis测试中的应用等内容。

  • 结束语 | Redis源码阅读,让我们从新开始

    我们不要因为一时的挫折而气馁,也不要因为一时的成就而停滞,就像生命之源的DNA结构一样,我们螺旋上升。

  • 结课测试 | 一套习题,测测你的Redis源码知识掌握程度

    一起来检测下学习成果吧!

你将获得

  • 从源码角度理解Redis系统设计思路
  • 经典C语言的开发技巧
  • 掌握计算机系统设计思想
  • Redis高频面试题目解析

讲师介绍


课程介绍

说实话,平常我们在基于Redis做应用开发的时候,可能只是把它作为一个缓存系统或是数据库来存取数据,并不会接触到源码层面的东西。

但实际上,我们在使用或运维Redis的时候,经常会面临Redis性能变差、Redis实例故障等会影响到业务应用运行的问题。再者,经历过大厂面试的人也知道,很多互联网公司在招聘资深技术岗时,都会问一些跟Redis相关的考点问题。

这些问题怎么解决、怎么回答,其实考验的就是我们对Redis底层源码的掌握程度。但是,阅读源码,你可能觉得想想都是一件很难的事情:我是想读Redis源码,但是总感觉无从下手,或者是无所适从,结果最后就不了了之了。

其实,你之所以“无从下手”的原因,是缺少了代码结构的全景图;而出现“无所适从”的问题,是缺少阅读目标的牵引和基本原理的支撑。简单来说,就是你没有掌握科学、高效的代码阅读方法。

所以在这门课程中,蒋德钧老师就会分享他实际阅读Redis源码总结出来的经验和方法,帮助你先从整体上掌握Redis源码的结构,也就是形成一幅Redis源码全景图。

然后,蒋老师会带你细分Redis的各大功能特性,梳理出Redis功能模块的主线逻辑,让你有目标、更高效地阅读和学习代码,进一步掌握Redis不同功能特性的设计与实现思路。并且在阅读代码的过程中,还会带你体会和掌握关键源码对应的计算机系统设计思想,从而你也可以把这些设计思想应用到自己的系统开发中。

课程模块设计

课程主体划分为以下6大模块。

  • 数据结构:你会学习到Redis主要数据结构的设计思想和实现,包括字符串的实现方法、内存紧凑型结构的设计、哈希表性能优化设计,以及ziplist、quicklist、listpack、跳表的设计与实现等。
  • 网络通信与执行模型:你会掌握Redis server的启动流程、高性能网络通信设计与实现、事件驱动框架的设计与实现、Redis线程类型的设计和优化等。
  • 缓存:你会了解常见的缓存替换算法是如何从原理转变为代码的,从而更深刻地理解Redis实现缓存算法的设计思路。
  • 可靠性保证:你会掌握RDB、AOF的具体实现,分布式系统中Raft一致性协议的设计实现,以及故障切换的关键代码实现等代码设计思路。
  • 切片集群:你会学习到Redis切片集群中关键机制的设计与实现,包括Gossip通信协议、请求重定向、数据迁移等,并帮你搞懂面试中关于构建提升Redis使用可扩展性的解题思路。
  • 编程技巧:你会学习和掌握Redis源码中使用的一些编程技巧,并可以应用到自己的程序开发中。

课程中如果没有特殊说明,老师介绍的源码都是基于 Redis 5.0.8 版本的。


课程目录


特别放送

免费领取福利


限时活动推荐


订阅须知

随机推荐

乔思伯(JONSBO)松果D31 MESH副屏版黑色 MATX机箱(双360冷排评...

诺梵松露巧克力圣诞节糖果低糖零食礼盒装4口味休闲零食代可可脂5...

绝对伏特加洋酒质量真的差吗?使用良心测评分享。

葵花药业维生素b族60片多种复合成人男士女士含b1b2b6叶酸怎么样...

葵花药业维生素b族60片多种复合成人男士女士含b1b2b6叶酸深度剖...

光明全脂高钙奶粉真的好吗?新手小白求助!