Redis核心源码那些事儿,边看边学边摸索到底怎么回事
- 问答
- 2025-12-27 17:04:12
- 1
要搞清楚Redis源码到底怎么回事,咱们不能一头扎进茫茫代码里,得找个有趣的切入点,这个切入点就是:当你敲下 SET mykey myvalue 这个最简单的命令时,Redis在背后到底忙活了些什么?跟着这个线索,我们就能摸到Redis的核心脉络。
你得把Redis的源码从GitHub上克隆下来,打开 src 目录,你会看到一堆 .c 和 .h 文件,别慌,我们重点关注几个“主角”。(来源:Redis源码根目录结构)
第一步,命令是怎么被认出来的?你输入的“SET”只是一个字符串,Redis启动时,在 server.c 这个无比重要的文件里,会调用一个叫 populateCommandTable 的函数(来源:server.c 文件),这个函数就像一本命令字典的编纂者,它把所有的命令名,SET", "GET", "DEL",和一个对应的函数指针关联起来,对于"SET"命令,它关联的函数就是 setCommand,这个字典在Redis里就叫 commandTable。(来源:Redis服务器初始化流程)

Redis怎么接收到你的命令的呢?这就要提到事件循环了,这是Redis高性能的基石,还是在 server.c 里,main 函数在经过一系列初始化后,会进入一个叫 aeMain 的循环(来源:server.c 中的main函数),这个循环由 ae(Antirez Event)事件驱动库 驱动,它不做别的事,就是一直等着有事情发生,有新的客户端连接来了,或者已有的客户端发送数据过来了。
当你的客户端通过网络发来 "SET mykey myvalue\r\n" 这条命令时,事件循环监听到这个连接有数据可读,就会触发一个回调函数,这个函数一般是 readQueryFromClient(来源:Redis网络事件处理函数),这个函数的工作就是把网络数据读进来,放到一个属于你这个连接的缓冲区里。

数据有了,下一步就是解析协议,Redis用的是自己设计的RESP(Redis Serialization Protocol)协议,解析过程在 networking.c 里的 processInputBuffer 函数中完成(来源:networking.c 文件),这个函数会解析你的请求,发现你发来的是个数组,里面有三个元素:"SET", "mykey", "myvalue",解析成功后,它就拿着第一个元素"SET",去我们一开始说的那个命令字典 commandTable 里查找,一查,找到了,对应的执行函数是 setCommand。
好,最激动人心的部分来了:执行命令,Redis会调用 setCommand 函数(这个函数在 t_string.c 文件里,因为SET是操作字符串的命令)(来源:t_string.c 文件),这个函数会做一些检查,比如参数个数对不对,然后就会调用一个更底层的函数——setGenericCommand。

setGenericCommand 是干实活的,但它需要和一个更核心的东西交互:Redis的键值对数据库本身,这个数据库在源码里用一个叫 redisDb 的结构体表示(来源:server.h 中的redisDb结构体定义),每个Redis服务器默认有16个这样的数据库,你的数据存在哪里呢?就存在 redisDb 的一个叫 dict 的成员里。这个 dict 就是Redis最核心的数据结构——字典(或者说哈希表),它承载了所有的键值对。
setGenericCommand 最终会调用字典的接口,把"mykey"和"myvalue"这个配对插入或更新到当前数据库的 dict 中,到这里,SET命令的核心任务就完成了。
但还没完!Redis有两个很重要的特性:过期时间和持久化,如果你的SET命令加了过期时间(SET mykey myvalue EX 10),那么在 setGenericCommand 里,它还会额外操作另一个字典,叫做expires字典(来源:redisDb 结构体中的expires字段),这个字典专门用来记录哪些键在什么时候过期,它会把你的"mykey"和过期时间戳存进去,这样Redis才能在后来的检查中自动删除过期的键。
如果Redis开启了AOF持久化,它还会把刚才执行的这条命令本身("SET mykey myvalue")追加到AOF缓冲区,最终写入磁盘文件,这样重启后还能恢复数据。(来源:Redis AOF持久化机制)
你看,就从一个最简单的SET命令出发,我们像侦探一样,顺藤摸瓜,接触到了Redis的几乎全部核心机制:事件循环、命令解析、字典数据库、过期策略、持久化,这个过程就是“边看边学边摸索”,下次你可以用同样的方式去追踪一个 GET 命令,看看它又是如何在那个巨大的 dict 字典里飞快地找到你的数据的,这样一点点拆解,Redis源码这个“黑盒子”就会在你面前慢慢变得透明起来。
本文由符海莹于2025-12-27发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/69527.html
