携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
1. 概述
Redis 底层是 Reactor模型。Reactor模型有三种:单线程Reactor模型,多线程Reactor模型,主从Reactor模型。
说 Redis 是单线程并不是说 Redis 生命周期只有一个线程,而是其主线程(即下图的任务队列以及事件分派器)为单线程。
对于网络IO以及持久化(RDB或者AOF)都是由子线程来执行的
2. Redis 快的原因
- 纯内存访问:数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。
- I/O多路复用:Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。
- 单线程避免了线程切换和竞态产生的消耗。
IO多路复用的知识可以参考:juejin.cn/post/711679…
官方表示,Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的性能瓶颈是机器的内存和网络带宽。
Redis是将所有的数据全部放在内存中的,所以说使用单线程去操作执行效率就是最高的,多线程在执行过程中需要进行 CPU 的上下文切换,这个是耗时操作。对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个 CPU 上的,在内存情况下,这个就是最佳方案。
3. 一次Redis请求的全过程
- 建立连接
- client 发送建立连接请求,IO多路复用器将请求放入队列
- 文件分派器将请求分给连接应答器处理
- 连接应答器建立连接,给IO多路复用器发送一个读就绪信号
- 开始处理
- 多路复用器将读操作放入队列,文件分派器将读命令分给命令请求处理器
- 命令请求处理器操作socket完成操作,并将写就绪命令给IO多路复用器
- 写就绪命令再经过一个类似的生命周期
- socket回复请求