Redis为什么这么快
概述
据Redis官方的测试,Redis可以达到100000以上的QPS本文主要探究,它为什么能这么快
原因概述
- Redis是完全基于内存的数据库
- 处理网络请求使用的是单线程,避免了不必要的上下文切换和锁的竞争维护。
- 使用了I/O多路复用模型。
完全基于内存
为什么要用完全呢。因为像mysql这样的成传统关系型数据库是索引文件存储来内存,数据文件存储在硬盘的,那么硬盘的性能和瓶颈将会影响到数据库。
- 硬盘型数据库工作模式:
- 内存型数据库工作模式:
本身内存和硬盘的读写方式不相同导致了它们在读写性能上的巨大差异。
单线程
需要注意的是,这里的单线程指的是,Redis处理网络请求的时候只有一个线程
,而不是整个Redis服务是单线程的。
单线程处理的好处
单线程处理也就是常说的串行处理,它和多线程处理各有优劣,不能一概而论。在Redis中由于是基于内存的数据库,它处理单个读写请求的速度非常快
,若使用的是多线程在任务调度和线程维护
上的消耗远大于处理请求的时间,这样会造成资源的浪费。
I/O多路复用模型
- 传统多进程并发模型: 每监听到一个Socket连接就会分配一个线程处理
-
多路复用模型: 单个线程,通过记录跟踪每一个Socket连接的I/O的状态来同时管理多个I/O流。
这里的I/O指的是网络I/O
,多路指的是多个网络连接
,复用指的是复用一个线程
。
结合Redis:
- 在Redis中的
I/O多路复用程序
会监听多个客户端连接的Socket - 每当有客户端通过Socket流向Redis发送请求进行操作时,I/O多路复用程序会将其放入一个
队列
中。 - 同时I/O多路复用程序会
同步
、有序
、每次传送一个任务给处理器处理。 - I/O多路复用程序会在上一个请求处理完毕后再继续分派下一个任务。(同步)