了解一波redis服务器与客户端交互过程。

客户端

多个客户端链接服务器会被顺序放到链表(list)当中,

输入缓冲区:
输入缓冲区(sds结构)的大小会根据输入内容动态缩小或者扩大,但它的最大大小不能超过1GB,否则服务器将关闭这个客户端,请求命令都会首先都会保存到缓冲区。

输出缓冲区:
执行命令所得的命令回复会被保存在客户端的输出缓冲区里面,每个客户端有两个缓冲区:

  • 固定大小的缓冲区用于保存哪些长度较小的回复,默认值16KB
  • 可变大小保存哪些长度较大的回复

服务器

分析程序会对输入缓冲区进行分析出命令,再通过命令执行器查找命令。

命令执行器:

  • 在命令表(redisCommandTable)中查找所指定的命令,并保存到客户端状态的cmd属性里面
  • 执行预备处理操作(权限、各种预处理)
  • 调用命令的实现函数void appendCommand(client *c);
  • 执行后续工作
  • 返回给客户端

serverCron函数:

  • 每个redis对象都会有一个lru属性,保存了对象的最后一次被命令访问的时间,10秒一次的频率更新

更多源码注释说明见https://github.com/dalaizhao/redis/tree/feature_code_comment