Redis(三)Redis线程模型

Redis(三)Redis线程模型文章目录 Redis 的线程模型 Redis 快的原因 Redis 线程模型原理 I O 多路复用技术 I O 多路复用与多线程的区别 I O 多路复用底层技术对比 Redis 的线程模型 Redis 快的原因 Redis 为什么这么快呢 其主要的原因有以下几个 纯内存操作单线程操作 避免了线程之间的切换 单线程指的是网络请求模块使用了一个线程 所以不需考虑并发安全性 即一个线程处理所有网络请求 其他模块仍用了多个线程 使用单线程模型也并不意味着程序不能并发的处理任务 Redis 虽然使用单线程模型处理用户的请求 但是它却使

Redis的线程模型

Redis快的原因

Redis为什么这么快呢,其主要的原因有以下几个:

  1. 纯内存操作
  2. 单线程操作,避免了线程之间的切换 - 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。使用单线程模型也并不意味着程序不能并发的处理任务,Redis 虽然使用单线程模型处理用户的请求,但是它却使用 I/O 多路复用机制并发处理来自客户端的多个连接,同时等待多个连接发送的请求。
  3. 非阻塞IO和I/O多路复用技术 - 在 I/O 多路复用模型中,最重要的函数调用就是 select 以及类似函数,该方法的能够同时监控多个文件描述符(也就是客户端的连接)的可读可写情况,当其中的某些文件描述符可读或者可写时,select 方法就会返回可读以及可写的文件描述符个数使用 I/O 多路复用技术能够极大地减少系统的开销,系统不再需要额外创建和维护进程和线程来监听来自客户端的大量连接,减少了服务器的开发成本和维护成本。

Redis线程模型原理

Redis操作起来非常快的原因了,其中最核心的就是使用了I/O多路复用的文件事件处理器。其原理是内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

以上的Redis线程执行流程图大概分为以下几个步骤完成:

  1. 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器
  2. 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
  3. 文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

I/O多路复用技术

举个例子,模拟一个tcp服务器处理30个客户socket。

假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

  • 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
  • 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
  • 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。 这种就是IO复用模型(Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。)

I/O多路复用与多线程的区别

  • io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系.
  • 跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源.而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂

I/O多路复用底层技术对比

  • select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
  • select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219321.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午10:51
下一篇 2026年3月17日 下午10:51


相关推荐

  • 国产操作系统: 盘点8款国产Linux桌面操作系统[通俗易懂]

    国产操作系统: 盘点8款国产Linux桌面操作系统[通俗易懂]2014年4月8日起,美国微软公司停止了对WindowsXPSP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。在这种背景下,国家出于计算机安全考虑,加大了针对操作系统开发力度,各软件企业纷纷开发自主操作系统。国产操作系统多以Linux为基础二次开发,今天我们为大家盘点一下二零一八年值得用户使用的国产Linux桌面操作系统。1.深度操作系统…

    2022年5月13日
    92
  • mshtml一些用法

    获取某个tags集合   CStringallPointData;             IDispatch*pDisp=webbrowser.get_Document();   IHTMLDocument2*pDocument;    IHTMLElementCollection*pCollection;

    2022年4月8日
    471
  • ubuntu vim 撤销和恢复操作

    ubuntu vim 撤销和恢复操作vim 撤销操作 uvim 恢复操作 ctrl r

    2026年3月17日
    2
  • c语言编写excel程序,C语言写excel文件(csv格式)

    c语言编写excel程序,C语言写excel文件(csv格式)csv 简化版 excel 在 PC 机上等同于 excel 可进行各种 excel 计算 画图 defineEACH FILE MAX BYTE 功能 存放数据为 csv 格式 输入 filename 写入 U 盘的文件名称 如 ai csv name

    2026年3月26日
    1
  • 中国Java培训机构09年度排行榜

    中国Java培训机构09年度排行榜 中国Java培训机构09年度排行榜 本站是个人网站, 因此排名标准是按照本人的个人感觉而定. 此排名的顺序主要依据:办学规模,在校人数,师资稳定度(全职讲师人数),口碑,视频好评度等.受经济危机影响,目前的总趋势是学费略有降低,但就业较难,起薪很低.建议有意参加者先看各类免费视频入门,并接触从各个培训学校毕业的…

    2022年10月3日
    5
  • pycharm2021.11.3永久激活_最新在线免费激活

    (pycharm2021.11.3永久激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号