Q: redis的高吞吐率具体指的是什么?# A: 在网络 IO 操作中能并发处理大量的客户端请求,并建立很多连接,却不会那么那么容易阻塞
Q: redis所说的单线程指的是哪些部分?哪些部分不是单线程? A: 单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程 需要额外线程执行的:
持久化 异步删除 集群数据同步 Q: 讲一下一次 Redis 客户端与服务器进行连接并且发送命令的过程? A:
客户端向服务端发起建立 socket 连接的请求,那么监听套接字将产生 AE_READABLE 事件,触发连接应答处理器执行。
进行应答,然后创建客户端套接字,以及客户端状态,并将客户端套接字的 AE_READABLE 事件与命令请求处理器关联。
客户端建立连接后,向服务器发送命令,那么客户端套接字将产生 AE_READABLE 事件,触发命令请求处理器执行,处理器读取客户端命令,然后传递给相关程序去执行。
执行命令获得相应的命令回复。
为了将命令回复传递给客户端,服务器将客户端套接字的 AE_WRITEABLE 事件与命令回复处理器关联。
当客户端试图读取命令回复时,客户端套接字产生 AE_WRITEABLE 事件,触发命令回复处理器将命令回复全部写入到套接字中。
Q: 上面的过程中, 如果没有IO多路复用,会有什么问题? A: 服务端将会有一个线程一直阻塞等待客户端的命令以及回复读取。占用CPU资源。
Q: 那改成IO多路复用后又是怎么优化的? A: 调用 epoll 机制,让内核监听这些套接字。 此时,Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。 正因为此,Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。
Q: redis的多路复用机制只有epoll吗? A:
Redis 基于的底层 I/O 多路复用库有多套。包括select、epoll、evport和kqueue等。
每个IO多路复用函数库在 Redis 源码中都对应一个单独的文件,比如ae_select.c,ae_epoll.c, ae_kqueue.c等。
Redis 会根据不同的操作系统,按照不同的优先级选择多路复用技术。事件响应框架一般都采用该架构,比如 netty 和 libevent