Redis通信协议

223 阅读2分钟

Redis通信协议

Redis 是单线程单进程的。Redis协议位于TCP之上, 客户端和实例保持双工连接。

RESP 格式

  • 间隔符号,linux \r\n windows是\n
  • 简单字符串, "+"开头
  • 错误Errors, 以"-"开头
  • 整数型Integer, ":"开头
  • 大字符串Bulk Strings, "$"开头, 长度512M
  • 数组, "*"开头

事件处理机制

Redis事件分为文件事件和时间事件

文件事件

Socket读写事件, 客户端的连接,命令请求, 数据回复, 连接断开。

Redis事件处理机制采取单线程的Reactor模式

  • select

    • writefds
    • readfds
    • exceptfds

    描述符有一定限制 FD_SETSIZE, 默认1024,数组存储。采用线性扫描,效率低

  • poll

    使用pollfd指针实现,包含了要监听的event和发生的event。

    采用链表方式存储, 监听的描述符没有限制,缺点在于, 线性扫描,效率低

  • epoll

    linux2.6内核出现的。使用一个文件描述符管理多个描述符。将用户关系的文件描述符事件存放在内核中的一个事件表。在用户空间和内核空间的copy只要一次。

    • epoll_create
    • epoll_ctl
    • epoll_await
  • kqueue

    unix的IO多路复用库。能处理大量数据,性能高。

    socket -> IO多路复用程序-> 文件事件分派器-> 事件处理器

  • 连接处理acceptTCPHandler

    客户端向Redis建立socket时, aeEventLoop会调用acceptTcpHandler处理函数,服务器会为每个链接创建一个Client对象,并创建相应的文件事件监听socket的可读事件,指定事件处理函数

  • 请求处理readQueryFromClient

    客户端socket发送数据后调用, 用read方法从socket读取数据到输入缓冲区,判断是否大于client_max_querybuf_len,大于返回错误。

  • 命令回复处理器sendReplyToClient

    将服务器执行命令后的命令回复返回给客户端

时间事件

分为定时和周期

  • id 全局唯一
  • when 毫秒时间戳,到达时间
  • timeProc 事件时间处理器