赞
踩
因为Redis是纯内存操作,执行速度非常快,性能的瓶颈是网络延迟而非执行速度
I/O多路复用模型主要就是实现了高效的网络请求
用户空间只能执行受限的命令(Ring3),权限较低
不能直接调用系统资源必须通过内核提供的接口来访问
内核空间可以执行特权命令(Ring0),调用一切系统资源
Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区
写数据时,要把用户缓存数据拷贝到内核缓存区,然后写入设备
读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓存区
阻塞IO就是在两个阶段中都需要阻塞等待
1:用户进程尝试读取数据的阶段
2:数据到达内核缓冲区拷贝到用户缓存区的阶段
非阻塞IO在用户进程尝试读取数据的阶段中
如果数据尚未到达,不会阻塞等待而是返回异常给用户进程
用户进程获取异常后会循环尝试读取直到数据就绪
在内核数据拷贝到用户缓冲区的过程中
用户进程依然是阻塞等待的状态直到拷贝完成
利用单个线程同时监听多个socket,在某个socket可读,可写时得到通知,避免无效的等待,充分利用CPU资源
阶段一:用户进程调用select指定要监听的socket集合,内核监听对应的多个socket,任意一个或多个socket就绪就返回readable
在这个过程中用户进程阻塞
阶段二:用户进程找到就绪的socket,依次调用recvfrom读取数据
内核将数据拷贝到用户空间
用户进程处理数据
select,poll:轮询socket确认哪个socket就绪
基于IO多路复用进行监听
监听每个客户端socket的连接(仅监听就绪的socket事件)
将这些事件派发给不同的处理器
在redis6.0之后引入了多线程模型
主要提高的是网络性能读取性能
在命令解析的部分,多线程解析命令转为redis操作(网络操作)
执行结果会存入缓冲队列,从缓冲区输出响应结果时也需要使用多线程(网络操作)
即响应客户端部分
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。