摘要:
在redis中,字符串类型sds struct是如下定义的: 41 struct sdshdr { 42 int len; 43 int free; 44 char buf[]; 45 };在其中,使用了char buf[]而不是char *buf。写了个测试程序,程序以及在64位机器上跑出来的结果如下:1 #include<stdio.h>2 3 struct sdshdr1 {4 int len;5 int free;6 char buf[];7 };8 struct sdshdr2 {9 int len;10 int free;11 char *buf;12 };... 阅读全文
摘要:
serverCron是redis每隔100ms执行的一个循环事件,由ae事件框架驱动。其主要执行如下任务:1.记录循环时间:server.unixtime = time(NULL)redis使用全局状态cache了当前的时间值。在vm实现以及lru实现中,均需要对每一个对象的访问记录其时间,在这种情况下,对精度的要求并不高(100ms内的访问值一样是没有问题的)。使用cache的时间值,其代价要远远低于每次均调用time()系统调用2.更新LRUClock值:updateLRUClock()后续在执行lru淘汰策略时,作为比较的基准值。redis默认的时间精度是10s(#defineREDIS 阅读全文
摘要:
initServer是redis对server进行初始化的入口,其由main调用,位于initServerConfig、命令行参数解析、守护进程判定之后,是server最重要的入口点。尽管代码看似简单(102行代码,且大量的赋值语句),但顺藤摸瓜,有很多点值得仔细看看。接下来逐行分析:函数第一件事是对信号进行处理: 899 signal(SIGHUP, SIG_IGN); 900 signal(SIGPIPE, SIG_IGN); 901 setupSignalHandlers();redis多作为守护进程运行,这时其不会有控制终端,首先忽略掉SIGHUP信号。(见AP... 阅读全文
摘要:
纯文本协议,请求-响应模式。看下边链接:http://redis.io/topics/protocol《Unix编程艺术》中明确倡导使用纯文本协议。作者在specification的开头就指出,Redis的协议设计是如下三点的折中:Simple to implementFast to parse by a computerEasy enough to parse by a human一个如此重视性能的代码实现选用了如此简单易懂的协议设计,相信对仍旧执拗于使用二进制协议设计的开发者是个启发。 阅读全文
摘要:
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 阅读全文
摘要:
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... 阅读全文
摘要:
aof是redis提供的一种数据持久化机制,通过将每一条命令dump下来,保持数据和内存中的数据一致。 1 #include "redis.h" 2 #include "bio.h" 3 4 #include <signal.h> 5 #include <fcntl.h> 6 #include <sys/stat.h> 7 #include <sys/types.h> 8 #include <sys/time.h> 9 #include <sys/resource.h> 10 #in 阅读全文
摘要:
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... 阅读全文
摘要:
这份代码是redis的client接口,其和server端的交互使用了deps目录下的hiredis c库,同时,在这部分代码中,应用了linenoise库完成类似history命令查询、自动补全等终端控制功能。 1 #include "fmacros.h" //用于mac下的兼容性处理 2 #include "version.h" //版本信息头文件,当前版本是2.4.10 3 4 #include <stdio.h> 5 #include <string.h> 6 #include <stdlib.h> 7 #in 阅读全文
摘要:
作者在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 .. 阅读全文