0%

redis网络IO模型和事件触发原理

[toc]


笔记来自
Redis进阶 - 事件:Redis事件机制详解


Q: redis的高吞吐率具体指的是什么?#

A:
在网络 IO 操作中能并发处理大量的客户端请求,并建立很多连接,却不会那么那么容易阻塞


Q: redis所说的单线程指的是哪些部分?哪些部分不是单线程?#

A:
单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程
需要额外线程执行的:

  • 持久化
  • 异步删除
  • 集群数据同步

Q: 讲一下一次 Redis 客户端与服务器进行连接并且发送命令的过程?#

A:

  1. 客户端向服务端发起建立 socket 连接的请求,那么监听套接字将产生 AE_READABLE 事件,触发连接应答处理器执行。

  2. 进行应答,然后创建客户端套接字,以及客户端状态,并将客户端套接字的 AE_READABLE 事件与命令请求处理器关联。

  3. 客户端建立连接后,向服务器发送命令,那么客户端套接字将产生 AE_READABLE 事件,触发命令请求处理器执行,处理器读取客户端命令,然后传递给相关程序去执行。

  4. 执行命令获得相应的命令回复。

    为了将命令回复传递给客户端,服务器将客户端套接字的 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。

    1bfbfd888006a50755f022d83af679ca0d670240


Q: redis有哪些时间事件?#

A:

  • 定时事件:让一段程序在指定的时间之后执行一次,执行完就不再执行了。
  • 周期性事件:让一段程序每隔指定时间就执行一次。