Redis为什么这么快
- Redis完全
**基于内存**
,内存的访问效率比硬盘快很多 - 执行命令为
**单线程**
,避免竞争状态下的线程切换造成资源浪费 - 基于
**非阻塞的IO多路复用机制**
**C语言编写**
,并且内部采用的数据结构经过**反复优化**
单Reactor单线程模型
- 服务端是
**单线程处理业务**
,本质上处理业务的是**同步IO阻塞**
的模型 - 会有大量的时间在阻塞环境,阻塞在 listen-socket中的accept中,或是阻塞在 read 或是write操作中
通过引入IO多路复用模型
- 在引入
**IO多路复用模型**
后,Reactor通过**epoll**
对**listen-socket**
进行监听,如果epoll监听到**listen-socket**
已经就绪,说明发生了连接事件,**产生事件后放入队列**
,由**文件事件分发器**
发送到对应的**连接应答处理器**
进行处理,同时**连接应答处理器返回client-socket**
- 在建立连接产生 client-socket后,也会被加入到epoll所监听,如果epoll监听到client-socket已经准备就绪,则说明发生了指令请求事件,产生事件后放入队列,由文件事件分发器发送到指令请求处理器进行处理,同时通过指令回复处理器通过 client-socket进行信息的回复。
- 如果是listen-socket 监听到准备就绪,则会生成AE_READABLE事件
- 如果是client-socket 监听到准备就绪,则会根据语句类型而生成 AE_READABLE和AE_WRITEABLE事件
为什么Redis6.0前使用单线程
- 在4.0后即引入多线程,除了主线程以外,还有后台线程在执行一些较为耗时的操作,例如删除无用的key,清理大Key等操作
- Redis的
**瓶颈不在于Cpu**
中,而在于**网络的IO**
,引入**多线程需要考虑很多的问题**
,而且在多线程情况下,在**线程切换之间也会耗费很多的资源**
。 - Redis是完全基于内存的,并且是纯KV操作,Redis可以理解为是一个大型的HashMap,因此除了时间复杂度为O(n)的操作,
**操作非常快**
。
为什么Redis6.0之后使用多线程
Redis主要的瓶颈在于**网络的IO**
,因此可以利用**多线程对IO进行优化**
。
- 使用线程组
**优化从socket读取信息的过程**
- 从socket读取到的信息需要
**解析请求**
,可以使用线程组优化 - 在主线程处理完数据后,需要
**通过socket进行数据的回写**
,IO过程可以使用优化