Redis的IO 模型

Redis 采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。但是由于是单线程如果线程被阻塞了,就无法进行多路复用了。

多路复用的高性能 I/O 模型

Redis是基于多路复用的高性能 I/O 模型,该机制允许内核中,同时存在多个监听套接字和已连接套接字(使用的非阻塞模式)。并且为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来,Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。

image-20230416162410275

Redis6.0新特性

随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 IO 的处理上,也就是说,单个主线程处理网络请求的速度跟不上底层网络硬件的速度

  • 单线程结构:

    在之前Redis 一直被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF 重写),但是,从网络 IO 处理到实际的读写命令处理,都是由单个线程完成的。

    image-20230418140012737
  • 多线程结构:

    Redis 的多 IO 线程只是用来处理网络请求的,对于读写命令,Redis 仍然使用单线程来处理。这是因为,Redis 处理请求时,网络处理经常是瓶颈,通过多个 IO 线程并行处理网络操作(即使用并行线程处理请求解析、结果响应),可以提升实例的整体处理性能。

    image-20230418135955502

    相关设置:

    • 开启多线程:io-threads-do-reads yes
    • 设置多线程数量:io-threads 6(一般来说,线程个数要小于 Redis 实例所在机器的 CPU 核个数,例如,对于一个 8 核的机器来说,Redis 官方建议配置 6 个 IO 线程。)