redis源码学习
文章平均质量分 74
看,未来
墨家学徒
展开
-
【redis 源码学习】空间配置(zmalloc)
要学习redis的架构,摆在眼前的,就是空间配置器,所以,第一篇学习,我就先把这座山挪开!!!一定是可以实现的!!!原创 2020-08-28 21:51:16 · 4585 阅读 · 28 评论 -
【redis源码学习】系列目录导航
万幸,赶在2022之前完成了这个系列,哈哈。【redis源码学习】redisObject【redis源码学习】simple dynamic strings(简单动态字符串 sds)【redis源码学习】跳跃表【redis源码学习】redis 专属“链表”:ziplist【redis源码学习】快速列表 quicklist【redis源码学习】看看redis的“哈希表”实现【redis源码学习】redis启动并读取配置文件的过程【redis源码学习】紧凑列表 listpack,t_hash的御.原创 2021-12-31 10:22:24 · 532 阅读 · 0 评论 -
【redis源码分析】redis cluster 集群实现
文章目录redis集群概述redis集群概述哨兵、主从、集群,一串下来。redis cluster 主要作用如下(虽然是显而易见了):1、数据分片,流量分发。cluster 将不同的数据分发给不同的节点,不过没有使用一致性hash算法,而是引入了Hash槽位的概念。cluster有16384个槽位,每个槽位只能指派给一个节点。...原创 2021-12-31 10:11:13 · 1006 阅读 · 0 评论 -
【redis源码分析】Redis Sentinel 是如何实际解决分布式共识问题的
文章目录开题Sentinel 结构Sentinel故障与安全模式:TITL模式故障转移主逻辑心跳监测判断下线 及 投票表决投票选举 leader哨兵故障转移状态机开题前几篇都偏离了轨道,方知写一个系列一定要先定指导思想。那几篇过于注重“what”和“why”了,但是我写这个系列的初衷是“how”,怎么做!所以,本篇将聚焦与以下几个问题:1、哨兵是如何监视节点的?2、哨兵是如何选举的?3、从节点是如何上位的?对于 分布式一致性算法raft 不了解的可以先了解一下:分布式一致性之raft算法,.原创 2021-12-30 12:10:40 · 865 阅读 · 0 评论 -
【redis源码学习】从源码角度看主从复制(3):全量同步 && 部分同步
文章目录全量同步 && 部分同步从节点发起同步流程部分同步全量复制全量同步 && 部分同步上一篇,我们的主从机以及搭上线了,那么从机连上主机,自然要更新一下缺失的数据,以期达到节点之同步状态。从节点发起同步流程对,没看错,同步流程是由从节点发起的。主节点那么忙,是吧。int slaveTryPartialResynchronization(connection *conn, int read_reply) { char *psync_replid; .原创 2021-12-29 16:30:34 · 296 阅读 · 0 评论 -
【redis源码学习】从源码角度看主从复制(2):主从之间的“三次握手”
主从握手流程1、发送 REPLICAOF 命令到某个服务端,要求它成为指定服务器的从节点2、在配置文件中写明主从关系下面我们从从节点的视角来看主从握手环节:一次握手从节点使用replicaofCommand 函数处理 REPLICAOF 命令,该命令主要逻辑为:1、如果处理的命令是:REPLICAOF NO ONE,则将当前服务器转换为主节点,取消原来的主从复制关系。2、调用 replicationSetMaster 函数,与指定服务器建立主从复制关系。/* Set replication.原创 2021-12-29 15:56:01 · 415 阅读 · 0 评论 -
【redis源码学习】从源码角度看主从复制(1):前期提要
文章目录主从复制概述主从复制使用结构主从复制概述关于主从复制的概述半年前写过,篇实践性,有兴趣的小伙伴可以看一下:【redis】跟我一起动手玩玩redis主从复制和哨兵模式一般来说,主从、哨兵、集群,三个我都放一起讲的,所以我再放一下关于集群的实践篇吧:【redis】闲得无聊,来聊聊当下爆火的 redis集群,顺便搭一个玩玩呗不过源码入手的话实在是庞大,光一块儿就要拆成好几篇来写。主从复制机制主要有以下作用:1、数据冗余2、读写分离,主写从读3、故障恢复,主机挂了哨兵马上扶持从机上位.原创 2021-12-29 15:36:41 · 618 阅读 · 0 评论 -
【redis源码学习】持久化机制(1):RDB
文章目录redis 的持久化机制RDB定时生成RDB文件后台生成RDB文件生成RDB文件将redis数据写入RDB文件中对每个键值对的写入redis 的持久化机制redis有两种持久化机制,RDB && AOF,关于其概念在我的redis系列里都有,这里就不再赘述啦。RDBRDB的执行有两种流程,一种是在配置文件中设置每n个键被修改就触发一次RDB快照,一种是通过bigsave命令。定时生成RDB文件RDB 通过 serverCron 函数实现定时生成 RDB 文件的任务,让.原创 2021-12-28 23:11:50 · 619 阅读 · 0 评论 -
【redis源码学习】传说中,redis使用的是单线程?
文章目录redis 的线程模型设置请求解析Redis I/O 线程的启停时机redis 命令执行过程RESP协议命令调用返回响应执行命令redis 的线程模型设置曾经确实是单线程,至于原因主要还是性能。在 redis6 之后,发现在数据量特别大的时候,网络 I/O 数据的读/写将占用执行期间大部分 CPU 时间,成为 Redis 主要性能瓶颈之一。后来便创建了I/O线程,将不同的客户端的I/O数据的读/写操作分配到不同的I/O线程中进行处理。可通过 io-threads 配置项设置I/O线程数量。.原创 2021-12-28 16:37:43 · 550 阅读 · 0 评论 -
【redis源码学习】事件机制
文章目录redis事件机制概述redis的事件循环器:aeEventLoopredis启动事件循环redis事件机制概述1、redis使用 IO 复用 实现网络通信。2、在Linux环境下选用epoll模式。redis的事件循环器:aeEventLoopacEventLoop 是 redis 的事件循环器,负责管理事件。/* State of an event based program */typedef struct aeEventLoop { int maxfd; //当前已注.原创 2021-12-27 19:51:31 · 583 阅读 · 0 评论 -
【redis源码学习】redis 中的“消息队列” Stream
文章目录关于redis StreamStreamlistpackziplist 的级联更新设计图 PKraxStream 结构关于redis Streamredis stream 实现了大部分消息队列的功能,包括:消息ID的序列化生成消息遍历消息的阻塞和非阻塞读取消息的分组消费ACK确认机制这一套组合拳打下来,我才明白原来我还不了解消息队列。可以先思考一下,如果是我们自己要实现一个消息队列,这些指导思想都有了,我们该怎么写呢?我稍微再提一些大环境:消息队列是要放在大并发的场景下,去.原创 2021-12-26 20:47:14 · 743 阅读 · 0 评论 -
【redis源码学习】rax,我愿称之为“升级版字典树”
文章目录rax VS trie数据结构查找函数插入元素删除元素迭代向后迭代向前迭代附上copyrightrax VS trie对于这个rax,那我们可更不陌生了,我觉得它就是把 trie 进行一个变种、压缩、强化。关于 trie,字典树,咱也是手写过的:数据结构(12)-- 前缀树(字典树、Trie)看一下前缀树和基数树的差别哈,以后有空了自己再手写一个基数树。 * 假设要存三个字符串:foo, footer, foobar * 这是一个没有压缩的结构 * * (.原创 2021-12-26 00:32:03 · 665 阅读 · 0 评论 -
【redis源码学习】紧凑列表 listpack,t_hash的御用底层结构
文章目录listpackziplist 的级联更新设计图 PKlistpackStream 定制的数据结构有两个:listpack 和 rax。这篇我们先讲一下 listpack。listpack 是对 ziplist 的优化。从5中率先在streams中引入listpack,直到6后作为t_hash御用底层数据结构,redis应该是发现极致的内存使用远远不如提高redis的处理性能。ziplist 的级联更新这个级联更新出现的概率极低,所以在ziplist的那篇我就没写。但是它一旦出现的话就是.原创 2021-12-25 23:43:54 · 600 阅读 · 0 评论 -
【redis源码学习】redis启动并读取配置文件的过程
文章目录配置文件redisServermain函数initServerConfigloadServerConfigFromString配置文件一个好的项目,是无状态的。状态在哪里?在配置文件里。这不我的毕设马上要用到开机配置文件了嘛,但是没有什么太好的想法,于是就想着学学redis是如何实现这个过程的,学完马上就能学以致用了。redis服务器的启动命令如下:redis-server [configfile] [options]configfile 参数指定配置文件,options 参数指定.原创 2021-12-24 11:37:49 · 1357 阅读 · 0 评论 -
【redis源码学习】看看redis的“哈希表”实现
文章目录抛砖引玉redis 中 哈希表的实现哈希函数冲突解决表结构单个节点容量变化rehash服务繁忙时的渐进式rehash!!!服务空闲时的批量rehash!!!迭代器间接迭代,防止大批量数据查询卷死自己抛砖引玉先手写一个哈希表吧。三小时过去…就这种源码中的数据结构啊,我个人是比较推崇大家自己先看概念手写一个,能不能动咱另说,在写的过程中会领悟到很多直接看所领悟不到的细节。redis 中 哈希表的实现哈希表主要看哪些方面?底层承载的数据结构、节点数据结构、哈希函数、冲突解决,还有啥?扩容与.原创 2021-12-23 17:20:52 · 1775 阅读 · 2 评论 -
【redis源码学习】快速列表 quicklist
文章目录关于quicklist无损压缩算法核心数据结构关于quicklist上一篇学习了ziplist,是一种很紧凑的列表。但是在中间删除的效率真的是不敢恭维。然后我也写了点自己的想法,不过倒是没有想到deque。deque是STL中的一种数据结构,不过似乎在STL中不如其他几个数据结构大众化。在nginx的节点设计中这种deque模式可是大放异彩。说了这么多,如果对STL了解稍多或者看过nginx源码就应该能猜到这个quicklist是什么了吧。一整块的 ziplist 增删(非尾)效率不高,那.原创 2021-12-23 00:52:59 · 427 阅读 · 0 评论 -
【redis源码学习】redis 专属“链表”:ziplist
文章目录问题抛出结构设计实际节点基本操作增重新编码解析数据重新分配空间接入数据问题抛出用过 Python 的列表吗?就是那种可以存储任意类型数据的,支持随机读取的数据结构。没有用过的话那就没办法了。本质上这种列表可以使用数组、链表作为其底层结构,不知道Python中的列表是以什么作为底层结构的。但是redis的列表既不是用链表,也不是用数组作为其底层实现的,原因也显而易见:数组不方便,弄个二维的?柔性的?怎么写?链表可以实现,通用链表嘛,数据域放 void* 就可以实现列表功能。但是,链表的缺点.原创 2021-12-22 21:30:44 · 967 阅读 · 0 评论 -
【redis源码学习】跳跃表
之前手写过跳表,所以概念性的东西就不多提,直接上链接:数据结构(9)-- 跳表在redis中跳表主要应用于有序集合的底层实现。这个别人怎么讲都意义不大,自己动手去写一下才知道其中的妙处与不容易。没有看起来那么好写。然后,来学习一下redis中是如何实现跳表的,看看自己跟大师的天差地别。文章目录跳表整体概览跳跃表节点跳跃表结构创建跳跃表随机数获取创建跳跃表结构创建跳跃表节点插入节点删除节点删除整表跳表整体概览1、由多层构成。2、有一个头节点,指向一个64层结构。还有个尾结点。3、除头结.原创 2021-12-22 01:42:44 · 369 阅读 · 0 评论 -
【redis源码学习】simple dynamic strings(简单动态字符串 sds)
文章目录接化sds 结构分析基本操作创建字符串释放字符串sdsMakeRoomFor 扩容小tip:`__attribute__ ((__packed__))`发接阅读源码之前,先接几个问题,我觉得还蛮有意思的。Q1:如何实现一个扩容方便且二进制安全(不会被\0打断)的字符串呢?Q2:SDS如何兼容C语言函数呢?Q3:SDS为了节约内存都秀了什么操作呢?Q4:SDS是如何扩容的?Q5:SDS是如何减少拷贝次数的?题外话:这种模式我还挺喜欢的,也写过一些源码分析类的博客,但是感觉看完之后就.原创 2021-12-20 20:56:51 · 587 阅读 · 0 评论 -
【redis源码学习】redisObject
使用的是redis6.0.6版本,因为我第一次接触 redis 时它就是这个最新稳定版。文章目录robj数据类型编码类型随机应变的对象编码回到robjrobjredis中的数据对象 server.h/redisObject 是redis内部存储的数据定义的抽象类型。//英文是自带的,中文是我写的typedef struct redisObject { unsigned type:4; //数据类型 unsigned encoding:4;//编码格式 unsig..原创 2021-12-20 11:32:12 · 470 阅读 · 0 评论