NingG +

Redis 设计与实现:客户端 & 服务器

这一部分专注:Redis 的客户端 & 服务器原理。

Redis,一服务器、多客户端:

redisClient 很重要,简单说一下其中包含的信息:

客户端

客户端的属性

套接字描述符:fd

名字:name

标志值:flag

关于上述Client的状态标志:FORCE_AOFFORCE_REPL

输入缓冲区:

命令与命令参数:

命令的实现函数:

输出缓冲区:

身份认证:

时间:

客户端的创建 & 关闭

整体上,客户端分为:普通客户端、伪客户端。其中,伪客户端指:不走网络连接的客户端,例如:AOF文件加载、Lua脚本执行Redis命令。

创建普通客户端:

关闭普通客户端:

client-output-buffer-limit <normal | slave | pubsub> <hard limit> <soft limit> <soft seconds>

Lua 脚本的客户端:

AOF 文件的客户端:

回顾

http://redisbook.com/preview/client/review.html

服务器

命令执行过程

客户端 & 服务器之间,执行命令的基本过程:

serverCron 函数

Redis 服务器中 serverCron 函数:

思考:serverCron 是 fork 出来的子进程复制执行的。

serverCron 函数的主要功能:

服务器初始化

启动服务器时,需要经过一系列的初始化,完成初始化之后,才能接受客户端的命令请求:

小结

几个关键点:

  1. 操作对象:redisClient
  2. 两个缓冲区:服务器端,redisClient 的输入缓冲区、输出缓冲区
  3. 执行前的分析和检查:命令执行之前,分析、检查命令
  4. 子进程:执行命令后,子进程进行必要处理

关于输出缓冲区:

  1. 分为:固定区(16KB)、可变区
  2. 一次命令的执行结果,不会被截断,只能存储到固定区或可变区
  3. 优先使用固定区,如果固定区空间不足,则将命令执行结果放置到可变区
  4. 如果可变区已经启用,则,不会继续向固定区追加数据
  5. 可变区分为:hard limitsoft limit + timeout,触发关闭 Client 条件
    • 超过 hard limit,立即关闭?
    • 超过 soft limit,并且timeout,立即关闭?

关闭 Client ,有两种情况,redisClient 中 flag:

  1. REDIS_CLOSE_AFTER_REPLY:返回执行结果后,再关闭
    • 适用命令:quit、kill、输入缓冲区中数据不符合协议规范
    • 不会继续读取输入缓冲区中命令
    • 不会向输出缓冲区,添加内容
    • 返回当前时刻输出缓冲区中内容
  2. REDIS_CLOSE_ASAP:异步释放,cronServer下次执行时,安全关闭
    • 使用情况:输出缓冲区,超过 hard limit、soft limit + timeout
    • 不会返回输出缓冲区中内容
    • cronServer下次执行时,安全关闭
    • 不是 As Soon As Possible

参考来源

Top