Skip to main content Link Menu Expand (external link) Document Search Copy Copied
  • 图片来源:https://www.bilibili.com/video/BV1cr4y1671t?p=160&vd_source=f52d9488d7d3c21ed33580e4dce1a022

1. 用户空间与内核空间

img.png

img.png

2. IO方式

2.1. 阻塞IO

block-io.png

2.2. 非阻塞IO

non-block-io.png

2.3. IO多路复用

img.png

img.png

2.3.1. select

img.png

2.3.2. poll

img.png

2.3.3. epoll

img.png

解决的问题:

  • 使用红黑树保存要监听的FD
  • 只拷贝一次FD到内核空间
  • 内核将就绪的FD直接拷贝到用户空间,不再用户空间自己去遍历出哪个FD是就绪的

epoll LT ET

io-epoll-LT.png

epoll web server

img.png

2.4. 信号驱动IO

img.png

2.5. 异步IO

img.png

3. 零COPY

io-zero-copy.png

因为使用mmap技术实现零拷贝,受到一定的内存大小限制,一般在1-2个G。 所以使用零拷贝技术的文件,大小一般在1G左右, 比如rocket MQ 的commit log文件就是1G一个。

4. 对比

img.png

5. 线程模型

  • 只是核心业务(命令处理),是单线程,整体redis(AOF)是多线程
  • 版本4.0 使用异步多线程的方式来执行删除命令
  • 版本6.0 在网络通信中引入多线程,提高多核CPU的利用率

6. 为什么使用线程

  • redis是纯内存(微秒),没有磁盘IO(毫秒),性能瓶颈是在网络延时,不是执行速度
  • 上下文切换会有开销
  • 要应对多线程不安全问题

7. redis 网络模型

img.png

8. redis 网络协议

img.png

9. redis 网络协议-数据类型

img.png