![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis 源码阅读
江江蒋
这个作者很懒,什么都没留下…
展开
-
redis对象编码源码阅读——有序集合编码和转码
redis对象编码源码阅读——有序集合编码和转码1. 有序集合对象的编码类型类型编码对象REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的有序集合对象REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象2. 两种编码的转换void zsetConvert(robj *zobj, int encoding) { zset *zs; zskiplistNode *n原创 2020-12-06 15:52:40 · 274 阅读 · 0 评论 -
redis自顶向下源码阅读(十二)——读取 RDB 文件2
redis自顶向下源码阅读(十二)——读取 RDB 文件21. 读取value/* Read value */// if ((val = rdbLoadObject(type,&rdb)) == NULL) goto eoferr;/* Load a Redis object of the specified type from the specified file.* On success a newly allocated object is returned, otherwise原创 2020-12-05 21:48:33 · 333 阅读 · 0 评论 -
redis对象编码源码阅读——集合编码与转码
redis数据结构源码阅读——集合编码与转码1. 集合对象的编码类型类型编码对象REDIS_SETREDIS_ENCODING_INTSET使用整数集合实现的集合对象REDIS_SETREDIS_ENCODING_HT使用字典实现的集合对象2. 集合的转码过程/* Convert the set to specified encoding. The resulting dict (when converting * to a hash table) is p原创 2020-11-26 16:34:53 · 161 阅读 · 0 评论 -
redis自顶向下源码阅读(十一)——读取 RDB 文件1
redis自顶向下源码阅读(十一)——读取 RDB 文件11. 声明变量int rdbLoad(char *filename) { uint32_t dbid; int type, rdbver; redisDb *db = server.db+0; char buf[1024]; long long expiretime, now = mstime(); FILE *fp; // 专门用于 io 的数据结构 rio rdb; /原创 2020-11-17 22:55:13 · 353 阅读 · 0 评论 -
redis对象编码源码阅读——列表对象编码与创建
redis数据结构源码阅读——列表对象编码与创建1. 列表对象的编码类型类型编码对象REDIS_LISTREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的列表对象REDIS_LISTREDIS_ENCODING_LINKEDLIST使用双端链表实现的列表对象摘自《Redis设计与实现》第63页2. 双端链表对象的创建robj *createListObject(void) { list *l = listCreate();原创 2020-11-17 21:48:40 · 130 阅读 · 0 评论 -
redis对象编码源码阅读——字符串编码过程
redis数据结构源码阅读——字符串编码过程对于RAW类型的字符串,需要进一步进行编码,判断它是不是可以表示为整型数;更进一步地,看它能否成为共享变量。当然这都是为了节约内存。/* Try to encode a string object in order to save space */robj *tryObjectEncoding(robj *o) { long value; sds s = o->ptr; size_t len;1. 判断是不是能编码原创 2020-11-17 00:41:23 · 410 阅读 · 0 评论 -
redis对象编码源码阅读——字符串编码与创建
redis数据结构源码阅读——字符串的创建1. 创建字符串对象在创建字符串对象的时候,有两种创建方式,一种是EMBSTR,一种是RAW.REDIS_ENCODING_EMBSTR_SIZE_LIMIT是一个比较小的值39。所以两者最大的区别就是长度。EMBSTR表示短字符串,RAW表示长字符串。robj *createStringObject(char *ptr, size_t len) { if (len <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT)原创 2020-11-17 00:25:45 · 219 阅读 · 0 评论 -
redis自顶向下源码阅读(十)——加载 AOF 文件
redis自顶向下源码阅读(十)——读取 AOF 文件1. 检查 linux 中的内存设置 // #ifdef __linux__ // linuxMemoryWarnings(); // #endifvoid linuxMemoryWarnings(void) { if (linuxOvercommitMemoryValue() == 0) { redisLog(REDIS_WARNING,"WARNING overcommit_memory i原创 2020-11-10 21:50:14 · 273 阅读 · 0 评论 -
redis自顶向下源码阅读(九)——设置进程名
redis自顶向下源码阅读(九)——设置进程名1. 设置进程名把进程名设置成“argv[0] bindaddr[0]:port mode"的形式,便于ps查询和观看// redisSetProcTitle(argv[0]);void redisSetProcTitle(char *title) {#ifdef USE_SETPROCTITLE char *server_mode = ""; if (server.cluster_enabled) server_mode = " [原创 2020-11-10 14:14:14 · 253 阅读 · 0 评论 -
redis自顶向下源码阅读(八)——初始化监听
把第一个地址设为 0.0.0.0int listenToPort(int port, int *fds, int *count) { int j; /* Force binding of 0.0.0.0 if no bind address is specified, always * entering the loop if j == 0. */ // 如果没有指定绑定地址,则强制绑定为 0.0.0.0 if (server.bindaddr_count ==原创 2020-11-06 21:31:09 · 161 阅读 · 0 评论 -
redis自顶向下源码阅读(七)——服务器初始化
1. 信号量操作忽略两个信号量 signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN);SIGHUP: hong up,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。SIGPIPE: 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.SIG_IGN: 表示对前面的信号量参数进原创 2020-11-05 23:27:25 · 216 阅读 · 0 评论 -
redis自顶向下源码阅读(六)——守护进程启动
1. 进行与守护进程有关的预处理如果配置文件中要求已守护进程启动redis,则进行守护进程的一些预处理。摆脱父进程把 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO重定位到"/dev/null"文件中。void daemonize(void) { int fd; if (fork() != 0) exit(0); /* parent exits */ setsid(); /* create a new session */原创 2020-11-05 15:58:05 · 104 阅读 · 0 评论 -
redis自顶向下源码阅读(五)——加载配置
redis自顶向下源码阅读(五)——加载配置1. 判断是不是查看version或help /* Handle special options --help and --version */ if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 ||原创 2020-10-30 16:45:22 · 168 阅读 · 0 评论 -
redis自顶向下源码阅读(四)——哨兵设置
redis自顶向下源码阅读(四)——哨兵设置1. main 函数代码 /* We need to init sentinel right now as parsing the configuration file * in sentinel mode will have the effect of populating the sentinel * data structures with master nodes to monitor. */ /* 我们现在需要初始化原创 2020-10-30 16:44:01 · 110 阅读 · 0 评论 -
redis自顶向下源码阅读(三)——配置初始化
redis自顶向下源码阅读(三)——配置初始化initServerConfig()1. 设置服务器运行 IDgetRandomHexChars()用SHA1加密算法对ID进行加密,确保每个服务器的ID都不一样。即如果ID不同,那么它肯定是另一台服务器,或者是同一台机器重启了。void getRandomHexChars(char *p, unsigned int len) { char *charset = "0123456789abcdef"; unsigned int原创 2020-10-29 22:18:41 · 195 阅读 · 0 评论 -
redis自顶向下源码阅读(二)——服务器初始化
redis自顶向下源码阅读(一)——服务器初始化先放出主函数前面一段的代码int main(int argc, char **argv) { struct timeval tv; /* We need to initialize our libraries, and the server configuration. */#ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, argv);#endif setlocal原创 2020-10-29 19:43:28 · 181 阅读 · 0 评论 -
redis自顶向下源码阅读(一)——序
redis自顶向下源码阅读(一)——序九月份回到学校,把《redis设计与实现》读完之后,觉得自己只是把理论知识泛泛地了解了一下,很多底层的实现(真正的代码部分)还是不够了解。所以,决定直接对源码进行阅读和博客记录。不知道需要花费多少时间哈哈。完成这部分计划就决定去面实习。gogogoredis版本redis3.0阅读的初步计划个人习惯喜欢从头到尾穿起来读,比较有连续性,所以采用自顶向下的阅读顺序,从主函数开始,一步一步地进入代码的逻辑。初步看了一下 redis.c 主函数,大概分为以下几个部分原创 2020-10-29 14:26:16 · 152 阅读 · 0 评论