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操作(网络操作)

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

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

即响应客户端部分

相关推荐
listening777几秒前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
AC赳赳老秦19 分钟前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
笑小枫25 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
霸道流氓气质38 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
我不想名字重复42 分钟前
redis缓存和数据库数据保持一致
数据库·redis·缓存
独隅1 小时前
IntelliJ IDEA 接入多种AI大模型插件终极指南(2026.1 企业合规版)
java·人工智能·intellij-idea
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework2 小时前
1.ansible安装 2.虚拟机克隆
java
码上解惑2 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
EasyGBS2 小时前
ONVIF设备接入国标GB28181视频平台EasyGBS:不用国标也能一键拉流!
服务器·php·音视频