• Redis不是单线程的吗?那其所谓的多线程是怎么回事?
  • 发布于 2个月前
  • 463 热度
    0 评论
  • 亦東風
  • 0 粉丝 49 篇博客
  •   
文章开始,要强调下:Redis 的多线程是将网络I/O操作进行了多线程处理,命令的执行仍然是由单线程进行的!

一 为什么要实现多线程
Redis本身的服务线程使用单线程,这主要是为了避免多线程的切换开销、共享资源的竞争等问题,可以保证高性能。但Redis使用单线程模型处理所有的网络I/O和命令执行任务。这意味着无论有多少个客户请求,它都会依次处理每个客户端发送过来的请求,遇到并发量超大的情况下,可能会成为性能瓶颈。

为了解决这个问题,引入了多线程I/O模型。在这个模型中,Redis主线程依旧负责处理客户端命令的执行,但是客户端请求的读取以及响应的写入等网络I/O操作被分发到多个工作线程中进行处理,操作如下图所示:

二  具体实现流程
1. Redis采用单线程+多路I/O复用的模式,通过epoll实现多路复用。
2. 在 Redis 的服务线程中,使用 epoll 来处理客户端的网络 I/O 事件,这保证了高性能的网络响应能力。
3. Redis 使用多路复用模型,可以并发处理多个客户端请求。epoll 将文件描述符的I/O事件通知给Redis,Redis 根据事件以非阻塞的方式处理每个连接上的命令。

4. 当有文件描述符事件到达时,调用PROCESS_CMD命令处理连接请求。该命令实现了命令解析,执行等功能。
5. PROCESS_CMD里面会launch子程序来完成对应命令的执行工作。子程序可以使用多线程。
6. 例如在KEYS命令时,会启动子线程来扫描获取所有Key,减少主线程的阻塞。
7. 对于CPU密集型子命令,会通过线程池来并行执行,提高性能。

总之,Redis主线程通过epoll来处理网络I/O,其它子命令可以通过多线程来并发执行,使得Redis可以高效处理大量并发请求。

三   带来的好处
这种设计使得Redis可以更好地利用多核CPU的性能,提高网络I/O的吞吐量,从而提升整体性能。然而,需要注意的是,由于命令的执行仍然是由单线程进行的,因此Redis的命令执行性能并没有得到显著提升。

用户评论