随笔分类 - redis源码阅读
记录自己阅读redis源码的过程
摘要:在sds.h中,定义sds为char* 类型 typedef char *sds; 然后就是 sdshdr5/8/16/32/64。的5种结构体,这五种都是使用了 __attribute__ ((__packed__))来进行手动内存对齐。 此外,sdshdr5从来没有使用过,只在内部使用flag位
阅读全文
摘要:redis通讯协议是基于RESP来实现的。由于redis过于优秀,所以很多公司内部的私有缓存也会去兼容RESP协议。 RESP本质是一种文本协议。也就是说,你直接抓包,是能看见明文的。 抓包命令: 因为我客户端和服务器是同一台,所以走的是环回口。 tcpdump -i lo port 7000 -A
阅读全文
摘要:客户端结构体用来存储client端连接的所有信息。 typedef struct client { uint64_t id; /* Client incremental unique ID. */ connection *conn; int resp; /* RESP protocol versio
阅读全文
摘要:1.对象结构体robj typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or *
阅读全文
摘要:本篇文章,想主要研究下beforesleep和aftersleep两个阶段redis究竟干了什么。 aftersleep只是处理module,可以忽略。 主要研究beforesleep。 1.刷新zmalloc_used变量和server.stat_peak_memory变量。很简单,就是当前的us
阅读全文
摘要:本来这章的标题是想写string类型的操作的。 但为什么改成SDS了哪? 因为我之前粗俗的认为redis只有string类型有用到SDS。但是在写这篇博客之前,稍微翻了下其他地方的源码,发现redis用到SDS的地方实际上是很多的。 所以将SDS认为只是string类型的底层结构其实是狭隘的。 所以
阅读全文
摘要:本章主要讨论在client连接到server时。server在ae过程中是如何处理的。 主要讨论的是接口函数。 大家可以把断点打在networking/acceptTcpHandler()下 以上函数在ae.c下如下部分调用: if (!invert && fe->mask & mask & AE_
阅读全文
摘要:书接上回,redis进入ae事件监听了。 相关的c文件都以ae开头,比如ae.c ae_epoll.c ae_ecport.c ae_select.c ae_kqueue.c ae相关的结构体在server.h的redisServer下的aeEventLoop结构体(eventloop)。 /* S
阅读全文
摘要:redis版本:6.2.6 为了调试方便,配置文件绝大部分保持一致,只修改如下: daemonize no。 关闭后台运行。这会影响debug,因为在server.c/6312行会进入daemonize(),然后执行setsid(),这样会导致debug退出。 然后将断点打在server.c/615
阅读全文
摘要:最近在学习redis的源码。在网上看了很多相关环境搭建。发现用的都是JetBrains的Clion。vs code相关的资料很少。 所以在此介绍一下如何用vscode 搭建redis debug环境。 一.linux配置: 很简单。把redis的源码包放在你想放的文件目录下就行了。git clone
阅读全文