[toc]
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。
Q: redis有哪些时间事件?#
A:
- 定时事件:让一段程序在指定的时间之后执行一次,执行完就不再执行了。
- 周期性事件:让一段程序每隔指定时间就执行一次。