Java面试题:Redis为什么速度快

Redis为什么速度快

Redis是纯内存操作

采用单线程,避免不必要的上下文切换可竞争条件
多线程还要考虑线程的安全问题
使用I/O多路复用模型,非阻塞IO

I/O多路复用模型

因为Redis是纯内存操作,执行速度非常快,性能的瓶颈是网络延迟而非执行速度

I/O多路复用模型主要就是实现了高效的网络请求

用户空间和内核空间

用户空间只能执行受限的命令(Ring3),权限较低

不能直接调用系统资源必须通过内核提供的接口来访问

内核空间可以执行特权命令(Ring0),调用一切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区

写数据时,要把用户缓存数据拷贝到内核缓存区,然后写入设备

读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓存区

常见的IO模型
阻塞IO(BIO)

阻塞IO就是在两个阶段中都需要阻塞等待

1:用户进程尝试读取数据的阶段

2:数据到达内核缓冲区拷贝到用户缓存区的阶段

非阻塞IO(NIO)

非阻塞IO在用户进程尝试读取数据的阶段中

如果数据尚未到达,不会阻塞等待而是返回异常给用户进程

用户进程获取异常后会循环尝试读取直到数据就绪

在内核数据拷贝到用户缓冲区的过程中

用户进程依然是阻塞等待的状态直到拷贝完成

IO多路复用(IO Multiplexing)

利用单个线程同时监听多个socket,在某个socket可读,可写时得到通知,避免无效的等待,充分利用CPU资源

阶段一:用户进程调用select指定要监听的socket集合,内核监听对应的多个socket,任意一个或多个socket就绪就返回readable

在这个过程中用户进程阻塞

阶段二:用户进程找到就绪的socket,依次调用recvfrom读取数据

内核将数据拷贝到用户空间

用户进程处理数据

linux中实现IO多路复用的方式

select,poll:轮询socket确认哪个socket就绪

epoll:通知用户socket就绪的同时把已就绪的socket写入用户空间
Redis网络模型

基于IO多路复用进行监听

监听每个客户端socket的连接(仅监听就绪的socket事件)

将这些事件派发给不同的处理器

连接应答处理器
命令回复处理器
命令请求处理器

在redis6.0之后引入了多线程模型

主要提高的是网络性能读取性能

在命令解析的部分,多线程解析命令转为redis操作(网络操作)

执行命令仍然使用单线程串行执行(线程安全)

执行结果会存入缓冲队列,从缓冲区输出响应结果时也需要使用多线程(网络操作)

即响应客户端部分

相关推荐
用户30745969820710 小时前
Redis 延时队列详解
redis
像我这样帅的人丶你还12 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩12 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
烤代码的吐司君12 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
tntxia12 小时前
Mybatis的日志输入
java
亦暖筑序14 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户2986985301417 小时前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao18 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿18 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰67518 小时前
字节跳动国际支付-后端开发-三面面经
java