在 redis 6.0 以前,完整的 redis 线程模型是 主线程(1个)+ 后台线程(三个),三个后台线程分别处理:
关闭 AOF、RDB 等过程中产生的大临时文件
将追加至 AOF 文件的数据刷盘(一般情况下 write 调用之后,数据被写入内核缓冲区,通过 fsync 调用才将内核缓冲区的数据写入磁盘)
惰性释放大对象(大键的空间回收交由单独线程实现,主线程只做关系解除,可以快速返回,继续处理其他事件,避免服务器长时间阻塞)
Redis 6.0之后,Redis 正式在核心网络模型中引入了多线程,也就是所谓的 I/O threading,至此 Redis 真正拥有了多线程模型。一般来说,一个正常的客户端请求会经历 建立连接、IO就绪监听/读、命令执行、IO写等一系列操作。
主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
主线程处理完读事件之后,通过Round Robin 将这些连接分配给这些IO线程。
主线程阻塞等待IO线程读取socket
主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行回写 socket
主线程阻塞等待 IO 线程将数据回写 socket 完毕
Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。
网友评论