广告
返回顶部
首页 > 资讯 > 数据库 >Redis中线程IO模型是什么
  • 117
分享到

Redis中线程IO模型是什么

2024-04-02 19:04:59 117人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Redis中线程io模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个单线程的应用程序,nodejs、Nginx都是单线

这篇文章将为大家详细讲解有关Redis线程io模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Redis是一个单线程的应用程序,nodejsNginx都是单线程,它们都属于服务器高性能的典范。

Redis之所以是单线程还能这么快的原因:

其一是因为它所有的数据都在内存当中,所有的运算都是内存级别的运算,所以使用redis时,要注意时间复杂度为O(n)的指令,因为是单线程的,如果数据量太大,会让其他指令被阻塞等待;

其二是因为redis使用非阻塞IO与多路复用处理大量的客户端连接。

非阻塞IO

当我们使用套接字的读写方法时,默认是阻塞的,

即调用read方法传递一个参数n,表示最多读取n个字节后返回,如果一个字节都没有,线程就会在read方法这里持续等待,直到有数据过来或者连接被关闭,read方法此时返回,线程才能执行下面的逻辑,

write方法一般不会阻塞,除非内核为套接字分配的写缓冲区满了,write方法才会阻塞,一直到缓存区中有空间闲出来。

下图是套接字读写的细节流程。

Redis中线程IO模型是什么

非阻塞IO在使用套接字时提供了一个选项Non_Blocking,当这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少,

能读多少取决与内核为套接字分配的读缓冲区的数据字节数,能写多少取决于内核为套接字写缓冲区分配的数据字节数,

读写方法都会通过返回值告诉程序读写了多少字节数。

非阻塞IO意味着读写时,线程不必再被阻塞着,读写可以瞬间完成,线程可以继续往下做别的事情。

多路复用(事件轮询)

非阻塞IO虽然很快,但是也带来一个问题,线程读数据,读了一部分就返回了,没有读完,剩下的数据何时继续读?,写数据,缓冲区满了,没有写完,剩下的数据何时继续写?

当可以继续读或者可以继续写时,应该给应用程序一个通知,告诉应用程序可以继续读或者继续写,事件轮询api就是用来处理这个问题的。

select

操作系统提供了一个select函数给用户程序,输入是读写描述符列表 read_fds & write_fds,输出是与之对应的可读可写事件,

同时还提供了timeout参数,线程最多等待timeout的时间,在这期间有事件过来,方法立刻返回,线程往下处理,如果超过timeout时间,方法也会返回,

如果拿到事件了,线程即可挨个处理相应的事件,处理完了以后继续调用 select api 轮询,所以该线程其实是一个死循环,不停的 select,不停的处理,来回这样,这个死循环被称之为事件循环,一个循环即一个周期。

Redis中线程IO模型是什么

事件循环伪代码:

while True
    read_events, write_events = select(read_fds, write_fds, timeout)
    for event in read_events:
        handle_read(event.fd)
    for event in write_events:
        handle_write(event.fd)
    handle_others() # 做其他的逻辑处理,处理定时任务等等

通过select函数我们可以处理多个通道描述符的读写事件,所以将select这类的系统函数调用称之为多路复用API,

现代操作系统的多路复用API已经不使用select系统调用,改用epoll(linux)和kqueue(FreeBSD、Macosx),

select的性能在描述符变多时会变得很差,epoll与select使用起来略有差异,不过都可以用上面的伪代码理解,都是当描述符发生事件时,循环对描述符的事件做出处理,

serverSocket对象的读操作是指调用accept接受客户端新连接,何时有连接来临,也是通过select调用的读事件通知的。

Java中的NIO技术就是事件轮询,其他语言也有这个技术。

指令队列

Redis为每一个客户端套接字关联一个指令队列,客户端发来的指令通过队列进行先进先出的顺序处理。

响应队列

同样Redis返回的结果也通过为每个客户端关联的一个队列返回,如果队列为空,则暂时不需要去获取写事件,

此时会将该客户端描述符从write_fds里移除,等队列有数据的时候,再将描述符放进去,这样可以避免select系统调用返回写事件时,发现没数据可写,造成空轮询、无用轮询,对机器CPU的消耗。

定时任务

服务器不单要响应IO事件,有些其他的事情也需要处理,例如应用程序自身的定时任务,如果线程阻塞在select调用上,等待select的返回,这会造成有些定时任务到期了,却没有执行,

Redis的定时任务记录在一个称为 最小堆 的数据结构中,这个堆中,最快要执行的任务排在最上方,每个循环周期里,redis会对堆中已经到时间点的任务进行处理,

处理完毕后,将堆中即将要执行的任务还需要的时间记录下来,再次调用select时,这个时间就是timeout的值,在这期间内不会有其他任务需要执行了,redis可以放心的最多阻塞这么久,然后到时间后进行相应的处理。

nodejs和Nginx的事件处理原理和Redis也是类似的形式。

关于“Redis中线程IO模型是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: Redis中线程IO模型是什么

本文链接: https://www.lsjlt.com/news/70138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中线程IO模型是什么
    这篇文章将为大家详细讲解有关Redis中线程IO模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个单线程的应用程序,NodeJs、Nginx都是单线...
    99+
    2022-10-19
  • Redis线程模型是什么
    这篇文章主要讲解了“Redis线程模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis线程模型是什么”吧! Redis它是一个单线程的,这一点需要去注意的。首先我们呢会有一个客...
    99+
    2023-06-30
  • Redis线程模型的原理是什么
    这篇文章主要介绍“Redis线程模型的原理是什么”,在日常操作中,相信很多人在Redis线程模型的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis线程模型的原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-21
  • Linux中五种IO模型是什么
    这篇文章主要介绍了Linux中五种IO模型是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、...
    99+
    2023-06-27
  • Linux网络编程中IO模型指的是什么
    今天就跟大家聊聊有关Linux网络编程中IO模型指的是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基于IO访问中存在的两个阶段详细介绍了Linux产生的五种IO模型。同步与异步...
    99+
    2023-06-06
  • Node.js中的单线程模型是什么
    这期内容当中小编将会给大家带来有关Node.js中的单线程模型是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、高并发一般来说,高并发的解决方案就是多线程模型,服务...
    99+
    2022-10-19
  • Android中的单线程模型是什么
    这篇文章给大家介绍Android中的单线程模型是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 单线程模型详解及实例当第一次启动一个Android程序时,Android会自动创建一个称为“main”主...
    99+
    2023-05-31
    android 单线 roi
  • Redis单线程的reactor模型是怎样的
    这篇文章主要讲解了“Redis单线程的reactor模型是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis单线程的reactor模型是怎样的”...
    99+
    2022-10-19
  • Java IO模型中的BIO,NIO和AIO是什么
    本篇内容主要讲解“Java IO模型中的BIO,NIO和AIO是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java IO模型中的BIO,NIO和AIO是什么”吧!一、I/O模型1.1 I...
    99+
    2023-06-29
  • redis中的单线程是什么
    redis中的单线程是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。官方FAQ表示,因为Redis是基于内存的操作,CPU...
    99+
    2022-10-18
  • Redis的内存模型是什么
    Redis的内存模型是什么?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。redis有五种对象类型:字符串、哈希、列表、集合、有序集合,丰富的类型...
    99+
    2022-10-18
  • redis是什么数据库模型
    Redis是一个开源的内存数据结构存储,支持诸多种数据结构,它是使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务的,因此不会产生并发问题,同时它具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Red...
    99+
    2022-10-16
  • 什么是Redis多线程
    这篇文章主要介绍“什么是Redis多线程”,在日常操作中,相信很多人在什么是Redis多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Redis多线程”的疑惑有所帮...
    99+
    2022-10-18
  • Java IO中Reactor网络模型的概念是什么
    小编给大家分享一下Java IO中Reactor网络模型的概念是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是 Reactor 模型:Th...
    99+
    2023-06-28
  • Java的IO模型和Netty框架是什么
    这篇文章主要介绍“Java的IO模型和Netty框架是什么”,在日常操作中,相信很多人在Java的IO模型和Netty框架是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的IO模型和Netty框架...
    99+
    2023-06-29
  • redis中单线程指的是什么
    小编给大家分享一下redis中单线程指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!那么为什么Redis是单线程的我们首...
    99+
    2022-10-18
  • Node.js中的进程、线程、协程与并发模型是什么
    这篇文章主要介绍“Node.js中的进程、线程、协程与并发模型是什么”,在日常操作中,相信很多人在Node.js中的进程、线程、协程与并发模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2022-10-19
  • Tomcat处理请求的线程模型是什么
    小编给大家分享一下Tomcat处理请求的线程模型是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言JAVA后端项目,运行在容器tomcat中,由于现在s...
    99+
    2023-06-29
  • redis服务中的单线程是什么
    redis服务中的单线程是什么?可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。redis是以socket方式通信,socket服务端可同时接受多个客户...
    99+
    2022-10-18
  • Redis的事件驱动模型是什么
    这篇文章主要讲解了“Redis的事件驱动模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的事件驱动模型是什么”吧!为什么 Redis 不使用基本的 Socket 编程模型?...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作