本文已参与「新人创作礼」活动,一起开启掘金创作之路。
IO模型
什么是IO多路复用
IO多路复用是一种同步IO模型,实现一个线程监控多个连接;当有IO请求时epoll等系统调用会返回fds列表,线程遍历有读写事件的socket进行数据收发,没有请求时线程会阻塞,交出CPU。
优势:一个线程同时处理多个socket请求,且不会浪费CPU。
多路是指多个网络连接,复用是指同一个线程监视。(epoll是NIO的一种,poll和select会阻塞)

IO机制
没有IO多路复用机制时,用BIO、NIO两种实现方式,但有一些问题。
同步阻塞IO(BIO)
服务端采用单线程,接受一个请求后,在接收或发送数据时,无法再接受其他请求,无法处理并发。
服务端采用多线程,接受一个请求后,开启线程进行接收,可以完成并发处理,但随着请求数增加需要增加线程数,大量的线程会占用很大存空间,并且线程的创建、切换、销毁开销大。
同步非阻塞IO(NIO)
服务器端接受一个请求后加入fds请求集合,轮询fds请求集合,有数据则接收数据,没有数据则返回错误而不会被阻塞,缺点:轮询浪费cpu。
异步IO(AIO):用户线程发出IO请求之后,继续执行,由内核进行数据读取并放在用户指定的缓冲区内,在IO完成之后通知用户线程直接使用。
redis存在线程安全的问题么
redis的工作线程是单线程串行执行命令,没有线程安全的问题。
外部使用redis时,要自行保障业务上的顺序执行。
虽然在Redis6.0时引入了IO多线程,但是只有在网络数据IO时才会使用多线程读写,而执行命令的主线程仍然是单线程,会保证程序的顺序执行。业务上依然可能存在并发问题,但这不是redis本身的问题,而是业务本身在设计时存在的问题。