正好最近时间富裕,看一看redis源码,简单的记录一下。也有可能说的是不全面的,自行斟酌,只能通过debug来简单的梳理本次测试流程,而不是全量的覆盖的所有测试用例,时不时更新,争取一天学一点点。
这里写目录标题
redis版本
6.27
流程图
如何调试?
我个人推荐使用clion来远程一台linux远程主机,我是很喜欢jetbrains全家桶的,远程调试go、python也是用的jetbrains编辑器。写unity C#的代码也用的是他家的rider。这篇讲解就很全了,其他远程调试也可以参考这个配,一个原理的配置链接
set 的简单尝试
当我们在redis-cli中输入set name:181:5720182219 dxgzg:5720182219
,redis收到的其实是"*3\r\n$3\r\nset\r\n$19\r\nname:181:5720182219\r\n$16\r\ndxgzg:5720182219\r\n"
。然后通过client这个结构体来进行解析。第一个三表示这行有三段,后面的$3表示有3个字符也就是set,$19表示的是后面有19个字符串,$16同理的,这样就构成的三个字段。processInputBuffer在这个函数解析的。
typedef struct client {
int multibulklen; // 就是上述的*3中的3,表示有三个字段 set key value
long bulklen; // 后面$的数字,指的是这段的长度,set自然就是3,依次类推
robj **argv; // 解析完的bulk存储在这里
struct redisCommand *cmd, *lastcmd; // cmd为本次的操作,这里为set
}
processMultibulkBuffer
主要是processMultibulkBuffer这个函数进行的数据构建,将命令行的数据存放到client中的argv
lookupCommand
lookupCommand用来设置client中的cmd
flushAppendOnlyFile
如果开启了AOF,输出到AOF文件中。server.c:2449行。明天看一下读盘的情况
handleClientsWithPendingWritesUsingThreads
将操作返回结果返回给客户端
打印字符串数组
我还是觉得转成指针打印比较方便
解析的堆栈流程
redis cmd
例如set zadd hget这些命令其实都存在于哈希里,简易的堆栈信息
一些基础的配置存放在sentinel.c这个文件下面
zadd
开启混合模式的话格式是怎么样的?
混合模式的话,文件是会放在aof文件中的,rdb在头,aof在尾巴存储,可以看这个字段aof-use-rdb-preamble
的介绍,改为yes就是开启混合模式了
没有aof文件的话看看是不是这个配置没打开
BGREWRITEAOF
,可以使用这个指令来重写一份aof文件,就可以看见rdb数据段了。