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

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

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

即响应客户端部分

相关推荐
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
来杯@Java5 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记5 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥5 小时前
匿名函数 lambda + 高阶函数
java·python·算法
isyangli_blog5 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
東雪木6 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r6 小时前
Java调用链MCP分析工具
java·python·ai编程
噜噜噜阿鲁~6 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
春生野草7 小时前
反射、Tomcat执行
java·开发语言
_日拱一卒7 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展