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

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

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

即响应客户端部分

相关推荐
稻草人想看远方3 分钟前
GC垃圾回收
java·开发语言·jvm
en-route1 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
得意霄尽欢1 小时前
Redis之底层数据结构
数据结构·数据库·redis
百锦再1 小时前
在 CentOS 系统上实现定时执行 Python 邮件发送任务
java·linux·开发语言·人工智能·python·centos·pygame
echoyu.1 小时前
消息队列-kafka完结
java·分布式·kafka
七夜zippoe1 小时前
分布式事务性能优化:从故障现场到方案落地的实战手记(二)
java·分布式·性能优化
栀椩1 小时前
springboot配置请求日志
java·spring boot·后端
番薯大佬1 小时前
Python学习-day8 元组tuple
java·python·学习
何似在人间5751 小时前
Go语言快速入门教程(JAVA转go)——1 概述
java·开发语言·golang
疯子@1232 小时前
nacos1.3.2 ARM 版容器镜像制作
java·linux·docker·容器