一篇文章告诉你,为什么单线redis可以那么快

news/2024/7/9 16:18:56 标签: 网络, java, epoll, redis, 多线程

redis的单线程主要是指redis的网路IO和键值对读写是由一个线程完成的,这也是redis对外提供键值存储服务的主要流程,但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

redis为何用单线程

一句话,因为多线程有其他的开销

单线程redis为什么快

一、redis大部分操作在内存上完成的,再加上高效的数据结构,如hash表跳表。

二、redis采用多路复用机制,使其在网络IO中能处理大量的客户端请求,实现高吞吐率

基本IO模型与阻塞点

以 Get 请求为例,SimpleKV 为了处理一个 Get 请求,需要监听客户端请求(bind/listen),和客户端建立连接(accept),从 socket 中读取请求(recv),解析客户端发送请求(parse),根据请求类型读取键值数据(get),最后给客户端返回结果,即向 socket 中写回数据(send)

下图显示了这一过程,其中,bind/listen、accept、recv、parse 和 send 属于网络 IO 处理,而 get 属于键值数据操作。既然 Redis 是单线程,那么,最基本的一种实现是在一个线程中依次执行上面说的这些操作。

但是,在这里的网络 IO 操作中,有潜在的阻塞点,分别是 accept() 和 recv()。当 Redis 监听到一个客户端有连接请求,但一直未能成功建立起连接时,会阻塞在 accept() 函数这里,导致其他客户端无法和 Redis 建立连接。类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()

这就导致 Redis 整个线程阻塞,无法处理其他客户端请求,效率很低。不过,幸运的是,socket 网络模型本身支持非阻塞模式。

非阻塞模式

Socket 网络模型的非阻塞模式设置,主要体现在三个关键的函数调用上,如果想要使用 socket 非阻塞模式,就必须要了解这三个函数的调用返回类型和设置模式。接下来,我们就重点学习下它们。

在 socket 模型中,不同操作调用后会返回不同的套接字类型。socket() 方法会返回主动套接字,然后调用 listen() 方法,将主动套接字转化为监听套接字,此时,可以监听来自客户端的连接请求。最后,调用 accept() 方法接收到达的客户端连接,并返回已连接套接字。

针对监听套接字,我们可以设置非阻塞模式:当 Redis 调用 accept() 但一直未有连接请求到达时,Redis 线程可以返回处理其他操作,而不用一直等待。但是,你要注意的是,调用 accept() 时,已经存在监听套接字了。

虽然 Redis 线程可以不用继续等待,但是总得有机制继续在监听套接字上等待后续连接请求,并在有请求时通知 Redis。

类似的,我们也可以针对已连接套接字设置非阻塞模式:Redis 调用 recv() 后,如果已连接套接字上一直没有数据到达,Redis 线程同样可以返回处理其他操作。我们也需要有机制继续监听该已连接套接字,并在有数据达到时通知 Redis。

这样才能保证 Redis 线程,既不会像基本 IO 模型中一直在阻塞点等待,也不会导致 Redis 无法处理实际到达的连接请求或数据。

到此,Linux 中的 IO 多路复用机制就要登场了。

基于多路复用的高性能I/O模型

Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。简单来说,在 Redis 只运行单线程的情况下, 该机制允许内核中,同时存在多个监听套接字和已连接套接字 。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

下图就是基于多路复用的 Redis IO 模型。图中的多个 FD 就是刚才所说的多个套接字。Redis 网络框架调用 epoll 机制,让内核监听这些套接字。此时,Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。正因为此,Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。

​ 基于多路复用的Redis高性能IO模型

为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。

那么,回调机制是怎么工作的呢?其实,select/epoll 一旦监测到 FD 上有请求到达时,就会触发相应的事件。

这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来,Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。同时,Redis 在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为 Redis 一直在对事件队列进行处理,所以能及时响应客户端请求,提升 Redis 的响应性能。

为了方便你理解,我再以连接请求和读数据请求为例,具体解释一下。

这两个请求分别对应 Accept 事件和 Read 事件,Redis 分别对这两个事件注册 accept 和 get 回调函数。当 Linux 内核监听到有连接请求或读数据请求时,就会触发 Accept 事件和 Read 事件,此时,内核就会回调 Redis 相应的 accept 和 get 函数进行处理

这就像病人去医院瞧病。在医生实际诊断前,每个病人(等同于请求)都需要先分诊、测体温、登记等。如果这些工作都由医生来完成,医生的工作效率就会很低。所以,医院都设置了分诊台,分诊台会一直处理这些诊断前的工作(类似于 Linux 内核监听请求),然后再转交给医生做实际诊断。这样即使一个医生(相当于 Redis 单线程),效率也能提升。

不过,需要注意的是,即使你的应用场景中部署了不同的操作系统,多路复用机制也是适用的。因为这个机制的实现有很多种,既有基于 Linux 系统下的 select 和 epoll 实现,也有基于 FreeBSD 的 kqueue 实现,以及基于 Solaris 的 evport 实现,这样,你可以根据 Redis 实际运行的操作系统,选择相应的多路复用实现

小结

现在,我们知道了,Redis 单线程是指它对网络 IO 和数据读写的操作采用了一个线程,而采用单线程的一个核心原因是避免多线程开发的并发控制问题。单线程的 Redis 也能获得高性能,跟多路复用的 IO 模型密切相关,因为这避免了 accept() 和 send()/recv() 潜在的网络 IO 操作阻塞点。


http://www.niftyadmin.cn/n/1227489.html

相关文章

pdf模板文件与方法参数_word在线转换pdf的方法推荐,如何快速转换pdf文件?

“龙门胜地,代出英豪,百年名校,再展雄姿。”2020年高考已经落下帷幕,我任职的学校频频传来捷报,本科、一本达线人数比去年剧增!当时领导们吩咐了一个任务,叫我这个语文老师编辑一份“金榜题名高…

java注解和反射讲义

反射和注解在java中偏高级用法,一般在各种框架中被广泛应用,文章简单介绍下反射和注解的用法,希望对你的工作学习有一定帮助 java注解 什么是注解 Java 注解也就是Annotation是从 Java5 开始引入的新技术 Annotation的作用: 不…

ubuntu下安装lxml报错_Ubuntu下GDAL编译与安装

1.GDAL下载DownloadSource - GDAL​trac.osgeo.org2.安装将安装包拷贝至usr/local下cd usr/local tar -zxvf gdal-2.3.0.tar.gz cd usr/local/gdal-2.3.0 ./configure sudo make sudo make install运行gadlinfo,报错gdalinfo: error while loading shared libraries…

一文带你jvm由浅入深

JVM是Java Virtual Machine(Java 虚拟机 )的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平…

大数据技术与实践

大数据概述 定义:   大数据一词由英文“big data”翻译而来,是最近几年兴起的概念,目前还没有一个统一的定义。相比于过去的“信息爆炸”的概念,它更强调数据量的“大”。 大数据的4V特征 数据量大Volume、变化速度快Velocity…

python知识图谱关系抽取算法_一种适用图文知识图谱的关系抽取方法与流程

本发明涉及信息处理领域,特别涉及图像目标检测以及知识图谱中的关系抽取算法。 背景技术: 图像目标检测目的是在于检测图像中包含的所有物体,基本做法是将图像划分区域后再对每个区域进行图像分类。 知识图谱中的一个关键技术就是关系抽取算法…

python社区发现_网络算法系列之社区发现(一):标签传播算法

社区发现简介 社区发现问题实际上是从子图分割的问题演变而来。在社交网络中,有些用户连接非常紧密,有些用户连接较为稀疏,这些连接紧密的用户可以看做一个社区,而社区之间连接较为稀疏。下图就展示了一个社区发现。目前的社区发现…

沉降观测曲线图 沉降观测汇总_南水北调中线干渠藻类残体颗粒与模型材料沉降特性研究...

原标题:藻类残体颗粒的沉降特性与模型材料选择摘要:南水北调中线干渠中藻类残体随流运动,容易在退水闸、分水口等突扩断面位置沉积,需要经常进行清淤工作。本文应用PTV粒子追踪测速技术,通过1组工况的藻类残体颗粒静水沉降试验和24组工况的不同模型材料、…