Redis 源码阅读笔记
文章平均质量分 78
源码层面详细解析 redis 实现
谈谈1974
火萎了,我也准备走了
展开
-
Redis 6.0 源码阅读笔记(13)-Redis 集群节点选举流程
文章目录1. 集群选举的处理2. 选举源码分析1. 集群选举的处理在 RedisCluster 集群实现原理 中提到过从节点通过选举晋升为主节点的过程,其处理大致如下2. 选举源码分析原创 2020-11-28 16:12:31 · 937 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(1)-Redis 服务端启动及命令执行
文章目录前言1. Redis 服务端启动流程2. Redis 命令执行流程前言本文基于 Redis 6.0 版本 ,读者如有兴趣可以自行点击链接进入 github 下载源码。Redis 用 C语言编写,其源码中不乏几百行的方法,这会给习惯了面向对象编程的读者造成一定的阅读障碍,不过仔细看的话也是能看懂的。Redis 服务端启动及命令执行的大致流程如下图所示,下文将对流程进行代码分析1. Redis 服务端启动流程Redis 是典型的 单 Reactor 单线程 的事件驱动模型,其服务端的启动也就是原创 2020-08-05 18:47:20 · 1589 阅读 · 2 评论 -
Redis 6.0 源码阅读笔记(12)-Redis 集群建立流程
文章目录1. Redis 集群2. 关键数据结构3. 集群建立源码分析1. Redis 集群在 RedisCluster 集群实现原理 中已经介绍过 Redis 3.0 版本以后使用 RedisCluster 作为分布式解决方案,其整个集群网络的建立依赖 Gossip 协议。以下为 Redis 集群建立的示意图,其大致处理流程为以下几个步骤:节点A 邀请 节点B 加入集群,节点A 与 节点B 建立连接节点A 邀请 节点C 加入集群,节点A 与 节点C 建立连接。二者通信时节点 A 将 节点B 的原创 2020-11-15 14:55:41 · 803 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(11)-主从复制 Slave 节点流程分析
文章目录1. 主从复制中 Slave 节点的处理2. 处理流程分析1. 主从复制中 Slave 节点的处理2. 处理流程分析原创 2020-10-31 16:37:49 · 700 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(10)-主从复制 Master 节点流程分析
文章目录1. Redis 主从复制概述2. 主从复制中 Master 节点的处理1. Redis 主从复制概述2. 主从复制中 Master 节点的处理原创 2020-10-30 16:49:37 · 1012 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(9)-数据淘汰原理
文章目录1. 过期时间的存储源码分析2. 数据的淘汰1. 过期时间的存储在 redisDb 数据结构 一节中已经提到过,redis 数据库中有一个专门的 expires 字典用于存储显式设置了过期时间的数据(如 SETEX 命令设置的数据)。本节以 SETEX 命令为例,依据源码分析过期时间的设置过程typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expi原创 2020-10-24 15:15:53 · 1494 阅读 · 9 评论 -
Redis 6.0 源码阅读笔记(8)-Stream 数据类型源码分析
文章目录1. 存储结构2. 源码分析1. 存储结构在 流对象 Stream 的介绍中已经提到 Stream 的底层存储结构为前缀压缩树,其结构示例如下:OBJ_ENCODING_STREAM底层采用压缩前缀树(radix tree) 来存储,其每个节点 raxNode 用于存储键值对相关数据,不同键相同的前缀字符将被压缩到同一个节点中,并使用 iskey 属性来标识从根节点到当前节点保存的键字符是否是完整的键Stream 添加数据的命令格式如下,其中 key 为 Stream 的名称,ID原创 2020-10-13 21:46:25 · 1114 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(7)-ZSet 数据类型源码分析
文章目录1. 存储结构2. 源码解析1. 存储结构在 有序集合对象 ZSet 的介绍中已经提到 ZSet 集合的底层存储结构主要有两种,其结构实例如下:OBJ_ENCODING_ZIPLIST当 ziplist 作为 zset 的底层存储结构时,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素值,第二个元素保存元素的分值,而且分值小的靠近表头,大的靠近表尾OBJ_ENCODING_SKIPLIST底层实现是跳跃表结合字典。每个跳跃表节点都保存一个集合元素,并按分值原创 2020-09-29 14:31:44 · 708 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(6)-Set 数据类型源码分析
文章目录1. 存储的结构2. 源码分析1. 存储的结构在 redis 集合对象 Set 的介绍中我们知道 redis 对于集合对象 Set 有以下两种存储形式,其内存结构如下所示:OBJ_ENCODING_INTSET集合保存的所有元素都是整数值是将会采用这种存储结构,但当集合对象保存的元素数量超过512 (由server.set_max_intset_entries 配置)后会转化为 OBJ_ENCODING_HTOBJ_ENCODING_HT底层为 dict 字典,数据作为字典的键原创 2020-09-20 12:43:48 · 1073 阅读 · 2 评论 -
Redis 6.0 源码阅读笔记(2)-Redis 多线程原理
文章目录前言1. Redis 多线程模型2. Redis 多线程源码分析2.1 IO 线程的初始化2.2 IO 线程的启动2.3 IO 线程处理读任务的流程前言Redis 6.0 中一个重大的改变就是引入了多线程IO。我们都知道 Redis 基于内存操作,几乎不存在 CPU 成为瓶颈的情况, 它主要受限于内存和网络。从 Redis 自身角度来说,读写网络的 read/write 系统调用占用了 Redis 执行期间大部分 CPU 时间,瓶颈其实主要在于网络的 IO 消耗。基于这种情况,Redis 优化原创 2020-09-13 15:58:13 · 2979 阅读 · 4 评论 -
Redis 6.0 源码阅读笔记(5)-List 数据类型源码分析
文章目录1. 存储的结构2. 数据存储源码分析1. 存储的结构redis 对于 List 的存储共有 3 种存储形式,其中 OBJ_ENCODING_LINKEDLIST已经彻底废弃不再讨论,其它两种存储形式的内存结构如下图示例:OBJ_ENCODING_ZIPLIST:底层结构类似数组,使用特定属性保存整个列表的元信息,如整个列表占用的内存大小,列表保存的数据开始的位置,列表保存的数据的个数等,其保存的数据被封装在 zlentryzlentry 是压缩列表保存数据的节点,其结构与 zipli原创 2020-09-05 18:09:44 · 709 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(4)-String 数据类型源码分析
文章目录1. 数据存储的结构2. 数据存储源码分析1. 数据存储的结构在 redis 字符串对象 String 的介绍中,我们知道 redis 对于字符串的存储共有 3 种存储形式,其存储的内存结构如以下图片示例:OBJ_ENCODING_INT: 保存的数据是可以用 long 类型来存储的整数值,那么存储方式就是直接将 redisObject 的 ptr 指针指向这个整数值OBJ_ENCODING_EMBSTR: 长度小于 44 (OBJ_ENCODING_EMBSTR_SIZE_LIM原创 2020-08-29 12:12:49 · 586 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(3)-概述 Redis 重要数据结构及其 6 种数据类型
文章目录1. 重要数据结构1.1 redisServer1.2 redisDb1.3 dict1.4 dictht1.5 dictEntry2. 数据类型2.1 Redis 数据对象结构2.2 Redis 数据类型及其存储结构2.2.1 字符串对象 String1. 重要数据结构Redis 有许多重要的数据结构,其存储结构从外层往内层依次是 redisDb、dict、dictht、dictEntryredisDb 默认情况下有16个,每个 redisDb 内部包含一个 dict 的数据结构,dict原创 2020-08-27 13:03:49 · 1491 阅读 · 0 评论