I/O的读写本身是堵塞的,比如socket有数据时。redis会通过调用先将数据从内核态空间拷贝到用户态空间。然后交给redis调用。而这个拷贝过程是阻塞的,当数据量越大,所需要的时间就越多。而这些操作是在单线程中完成的。
从Redis6开始,就新增了多线程功能来提高I/O读写能力,它主要实现思路是:将主线程的读写任务拆分成一组独立的线程去执行,这样就可以使多个socket的读写并行化。采用I/O多路复用技术可以让单个线程高效处理多个连接请求(减少网络IO的时间的消耗),将最耗时的socket读取,请求解析,写入单独外包出去,剩下的命令执行仍然由主线程执行,并将结果写入内存。然后再由I/O线程读取内存的数据,返回给客户端。
网络IO操作就变成了多线程化,其他线程仍然是线程安全的。是个不错的折衷办法。
Redis6/7将 读取socket,解析请求通过多个I/O线程处理。
对于真正的执行命令来说,仍然使用主线程操作.一举两得。