设为首页 收藏本站
查看: 3173|回复: 0

[经验分享] redis源码笔记

[复制链接]

尚未签到

发表于 2015-7-22 09:13:08 | 显示全部楼层 |阅读模式
  redis源码笔记 - 刘浩de技术博客 - 博客园
redis源码笔记


记录发现的一个hiredis的bug

摘要: hiredis是redis官方提供的c客户端库。在读代码的过程中,发现了一个bug,记录一下。hiredis里定义了一个上下文结构(struct redisContext),代码如下(deps/hiredis/hiredis.h):https://github.com/antirez/hiredis/blob/master/hiredis.h157 /* Context for a connection to Redis */158 typedef struct redisContext {159 int err; /* Error flags, 0 when there is no ...阅读全文
posted @ 2012-06-20 17:47 刘浩de技术博客 阅读(800) | 评论 (0) 编辑

redis源码笔记 - serverCron

摘要: serverCron是redis每隔100ms执行的一个循环事件,由ae事件框架驱动。其主要执行如下任务:1.记录循环时间:server.unixtime = time(NULL)redis使用全局状态cache了当前的时间值。在vm实现以及lru实现中,均需要对每一个对象的访问记录其时间,在这种情况下,对精度的要求并不高(100ms内的访问值一样是没有问题的)。使用cache的时间值,其代价要远远低于每次均调用time()系统调用2.更新LRUClock值:updateLRUClock()后续在执行lru淘汰策略时,作为比较的基准值。redis默认的时间精度是10s(#defineREDIS阅读全文
posted @ 2012-06-06 20:33 刘浩de技术博客 阅读(950) | 评论 (0) 编辑

redis源码笔记 - initServer

摘要: initServer是redis对server进行初始化的入口,其由main调用,位于initServerConfig、命令行参数解析、守护进程判定之后,是server最重要的入口点。尽管代码看似简单(102行代码,且大量的赋值语句),但顺藤摸瓜,有很多点值得仔细看看。接下来逐行分析:函数第一件事是对信号进行处理: 899 signal(SIGHUP, SIG_IGN); 900 signal(SIGPIPE, SIG_IGN); 901 setupSignalHandlers();redis多作为守护进程运行,这时其不会有控制终端,首先忽略掉SIGHUP信号。(见AP...阅读全文
posted @ 2012-05-30 21:23 刘浩de技术博客 阅读(1150) | 评论 (2) 编辑

redis源码笔记 - Protocol specification

摘要: 纯文本协议,请求-响应模式。看下边链接:http://redis.io/topics/protocol《Unix编程艺术》中明确倡导使用纯文本协议。作者在specification的开头就指出,Redis的协议设计是如下三点的折中:Simple to implementFast to parse by a computerEasy enough to parse by a human一个如此重视性能的代码实现选用了如此简单易懂的协议设计,相信对仍旧执拗于使用二进制协议设计的开发者是个启发。阅读全文
posted @ 2012-05-28 16:35 刘浩de技术博客 阅读(78) | 评论 (0) 编辑

redis源码笔记 - 有关LRU cache相关的代码

摘要: redis可以被作为类似memcached的应用级缓存使用,在内存超过限制时,按照配置的策略,淘汰掉相应的kv,使得内存可以继续留有足够的空间保存新的数据。redis的conf文件中有对该机制的一份很好的解释:194 # Don't use more memory than the specified amount of bytes.195 # When the memory limit is reached Redis will try to remove keys196 # accordingly to the eviction policy selected (see maxme阅读全文
posted @ 2012-05-27 09:15 刘浩de技术博客 阅读(105) | 评论 (0) 编辑

redis源码笔记 - redis对过期值的处理(in redis.c)

摘要: redis允许对key设置超时时间,实现过期key的自动淘汰。这篇blog分析下,其自适应(adaptive)的淘汰机制。redis每隔100ms定时执行的循环(serverCron function)里有如下语句: 655 /* Expire a few keys per cycle, only if this is a master. 656 * On slaves we wait for DEL operations synthesized by the master 657 * in order to guarantee a strict consisten...阅读全文
posted @ 2012-05-25 15:56 刘浩de技术博客 阅读(110) | 评论 (0) 编辑

redis源码笔记 - aof

摘要: aof是redis提供的一种数据持久化机制,通过将每一条命令dump下来,保持数据和内存中的数据一致。 1 #include "redis.h" 2 #include "bio.h" 3 4 #include  5 #include  6 #include  7 #include  8 #include  9 #include  10 #in阅读全文
posted @ 2012-05-22 20:04 刘浩de技术博客 阅读(52) | 评论 (0) 编辑

redis源码笔记 - slowlog

摘要: slowlog是redis提供的进行query分析的工具。它将执行时间长的命令统一以list形式保存在内存之中,使用者可以通过slowlog命令查看这些慢query,从而分析系统瓶颈。最好的分析笔记是作者的注释,除此之外,会做简要记录。slowlog.h 1 /* This structure defines an entry inside the slow log list */ 2 typedef struct slowlogEntry { 3 robj **argv; //记录query参数 4 int argc; 5 l...阅读全文
posted @ 2012-05-20 19:12 刘浩de技术博客 阅读(72) | 评论 (0) 编辑

redis源码笔记 - redis-cli.c

摘要: 这份代码是redis的client接口,其和server端的交互使用了deps目录下的hiredis c库,同时,在这部分代码中,应用了linenoise库完成类似history命令查询、自动补全等终端控制功能。 1 #include "fmacros.h" //用于mac下的兼容性处理 2 #include "version.h" //版本信息头文件,当前版本是2.4.10 3 4 #include  5 #include  6 #include  7 #in阅读全文
posted @ 2012-05-20 12:40 刘浩de技术博客 阅读(72) | 评论 (3) 编辑

redis源码笔记 - bio

摘要: 作者在bio.c的头注释中对设计进行了详细的介绍/* Background I/O service for Redis. 这个文件是redis后台IO服务的实现 * * This file implements operations that we need to perform in the background. * Currently there is only a single operation, that is a background close(2) * system call. This is needed as when the process is the last ..阅读全文
posted @ 2012-05-17 20:52 刘浩de技术博客 阅读(75) | 评论 (0) 编辑

redis源码笔记-ae_epoll.c

摘要: 这部分代码是具体事件触发网络库的底层实现。Linux下有epoll设施,而且其效率是现在最高的。注意即使高效如redis,其也只是选择了自动档-水平触发(自动档和手动档的典故请自行google)。据说libevent也是使用的水平触发。废话不多说,看代码吧。 1 #include  2 3 typedef struct aeApiState { 4 int epfd; 5 struct epoll_event events[AE_SETSIZE]; //存的是epoll_wait返回后得到的事件列表 6 } aeApiState; //作为event...阅读全文
posted @ 2012-05-16 22:24 刘浩de技术博客 阅读(71) | 评论 (1) 编辑

redis源码笔记-ae.c

摘要: ae.c是redis事件框架的具体实现,这篇blog对这份源码进行简单说明。其中谈到了作者已经标记的一些未来可能做的改进。ae.c 1 #include  2 #include  3 #include  4 #include  5 #include  6 7 #include "ae.h" 8 #include "zmalloc.h" 9 #include "config.h&q阅读全文
posted @ 2012-05-15 22:11 刘浩de技术博客 阅读(66) | 评论 (0) 编辑

redis源码笔记-ae.h

摘要: ae框架是redis作者开发的事件处理框架,其目的和libevent项目类似。redis本着最小依赖原则,自己实现了一套,而且速度更快。ae只有不到500行代码,但据说libevent有3万加的代码,实现这一个功能所付出的代码量已经超过了redis所有的代码量。ae.h 1 #ifndef __AE_H__ 2 #define __AE_H__ 3 //同时支持的连接数,其实这个还是可以设的更大一些 4 #define AE_SETSIZE (1024*10) /* Max number of fd supported */ 5 6 #define AE_OK 0 7 #defi...阅读全文
posted @ 2012-05-15 08:23 刘浩de技术博客 阅读(62) | 评论 (0) 编辑

redis源码笔记-config

摘要: redis配置文件的头文件,有一些和平台有关的配置,在这里边进行设置。config.h 1 #ifndef __CONFIG_H 2 #define __CONFIG_H 3 4 #ifdef __APPLE__ 5 #include  6 #endif 7 8 /* Define redis_fstat to fstat or fstat64() */ 9 #if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)10 #define redis_fstat fst阅读全文
posted @ 2012-05-13 09:54 刘浩de技术博客 阅读(88) | 评论 (0) 编辑

redis源码笔记-endian

摘要: 对于目标机是大端字节序的机器,进行字节码的转换,提供了16byte、32byte、64byte字节的转换。在intset\ziplist\zipmap三种数据结构中使用,使得不同字节序机器生成的rdb文件格式都是统一的(小端字节序),便于兼容。代码实在是太简单了,贴上来,不多说了。endian.h 1 #ifndef __ENDIAN_H 2 #define __ENDIAN_H 3 4 void memrev16(void *p); 5 void memrev32(void *p); 6 void memrev64(void *p); 7 8 /* variants of the fun..阅读全文
posted @ 2012-05-12 22:18 刘浩de技术博客 阅读(43) | 评论 (0) 编辑

redis源码笔记-anet

摘要: anet库是redis对tcp网络层以及unix域实现的一个封装。redis的客户端和server端通信使用的均为TCP协议。Basic TCP socket stuff made a bit less boringanet.h 1 #ifndef ANET_H 2 #define ANET_H 3 4 #define ANET_OK 0 5 #define ANET_ERR -1 6 #define ANET_ERR_LEN 256 7 8 #if defined(__sun) 9 #define AF_LOCAL AF_UNIX10 #endif11 12 i...阅读全文
posted @ 2012-05-12 20:47 刘浩de技术博客 阅读(61) | 评论 (0) 编辑

redis源码笔记-dict.c

摘要: 这篇blog介绍dict的实现。dict.c 1 #include "fmacros.h" 2 3 #include  4 #include  5 #include  6 #include  7 #include  8 #include  9 #include  10 #include  11 12 #include &q阅读全文
posted @ 2012-05-12 17:19 刘浩de技术博客 阅读(68) | 评论 (0) 编辑

redis源码笔记-dict.h

摘要: 这篇介绍redis最后一个基础数据结构——hash表。可以毫不夸张的说,hash表是redis一切存储的基础,也是redis得以快如飞的基础。注:其实还有个intset,不过intset是在持久化dump到硬盘时为节省空间设计的,和我们这里谈的不一样。dict的设计呢,简单的说是一个双表,“一主一从”,不定时rehash,建议大家在读代码前能够对这个设计有所了解。Anyway,随便搜一搜,很多文章的。dict.h 1 #ifndef __DICT_H 2 #define __DICT_H 3 4 #define DICT_OK 0 5 #define DICT_ERR 1 6 ...阅读全文
posted @ 2012-05-12 13:02 刘浩de技术博客 阅读(48) | 评论 (0) 编辑

redis源码笔记-testhelp

摘要: testhelp.h是作者为redis量身定做的单元测试框架,对于redis这种规模的项目,就没有必要上GTEST这种大杀器了,作者18行代码搞定。不过很遗憾,在2.4.10这个版本的版本的redis中,只有sds用了这个测试框架,不知其他代码作者是如何做测试的。我慢慢摸索,摸索到了告诉大家。 1 #ifndef __TESTHELP_H 2 #define __TESTHELP_H 3 4 int __failed_tests = 0; //失败的测试用例数 5 int __test_num = 0; //总的测试用例数 6 #defin...阅读全文
posted @ 2012-05-12 10:01 刘浩de技术博客 阅读(36) | 评论 (0) 编辑

redis源码笔记-sds

摘要: sds和adlist一样,是redis的基础数据结构之一,是其为自身实现的字符串类型。A C dynamic strings librarysds.h 1 #ifndef __SDS_H 2 #define __SDS_H 3 4 #define SDS_MAX_PREALLOC (1024*1024) //字符串最大的预分配长度是1M 5 6 #include  7 #include  8 9 typedef char *sds; //sds本身被typedef为char*,是后续绝大部分函数的参数(之一)10...阅读全文
posted @ 2012-05-12 09:10 刘浩de技术博客 阅读(64) | 评论 (0) 编辑

redis源码笔记-adlist

摘要: adlist是redis自己是实现的一个通用的双向链表。------------------------------------------------adlist.h---------------------------------------------------#ifndef __ADLIST_H__#define __ADLIST_H__/* Node, List, and Iterator are the only data structures used currently. */typedef struct listNode {struct listNode *prev;str阅读全文
posted @ 2012-05-10 23:24 刘浩de技术博客 阅读(77) | 评论 (0) 编辑

redis源码笔记-redis.conf

摘要: redis.conf是redis-server的配置文件# Redis configuration file example# Note on units: when memory size is needed, it is possible to specifiy# it in the usual form of 1k 5GB 4M and so forth:## 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 b阅读全文
posted @ 2012-05-10 00:10 刘浩de技术博客 阅读(79) | 评论 (0) 编辑

计划开始写redis的源码分析笔记

摘要: 每天抽出时间来读一读代码,只是作为学习的目的,尽量写的系统些。redis的版本选的2.4.10。形式以源码剖析的方式写,类似于结合代码写注释。阅读全文

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-89324-1-1.html 上篇帖子: Redis的安装与配置 下篇帖子: Linux下安装Redis服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表