正好最近时间富裕,看一看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这个结构体来进行解析
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
将操作返回结果返回给客户端
打印字符串数组
我还是觉得转成指针打印比较方便