Skip to content
发布于 更新于

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

基于 VitePress + GitHub Actions 自动部署