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 事件时间处理器