应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

最近沉迷Redis网络模型,无法自拔!终于知道Redis为啥

  1。用户空间和内核态空间1。1为什么要区分用户和内核
  服务器大多都采用Linux系统,这里我们以Linux为例来讲解:
  ubuntu和Centos都是Linux的发行版,发行版可以看成对linux包了一层壳,任何Linux发行版,其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互
  用户的应用,比如redis,mysql等其实是没有办法去执行访问我们操作系统的硬件的,所以我们可以通过发行版的这个壳子去访问内核,再通过内核去访问计算机硬件
  计算机硬件包括,如cpu,内存,网卡等等,内核(通过寻址空间)可以操作硬件的,但是内核需要不同设备的驱动,有了这些驱动之后,内核就可以去对计算机硬件去进行内存管理,文件系统的管理,进程的管理等等
  我们想要用户的应用来访问,计算机就必须要通过对外暴露的一些接口,才能访问到,从而简介的实现对内核的操控,但是内核本身上来说也是一个应用,所以他本身也需要一些内存,cpu等设备资源,用户应用本身也在消耗这些资源,如果不加任何限制,用户去操作随意的去操作我们的资源,就有可能导致一些冲突,甚至有可能导致我们的系统出现无法运行的问题,因此我们需要把用户和内核隔离开1。2进程寻址空间
  进程的寻址空间划分成两部分:内核空间、用户空间
  什么是寻址空间呢?我们的应用程序也好,还是内核空间也好,都是没有办法直接去物理内存的,而是通过分配一些虚拟内存映射到物理内存中,我们的内核和应用程序去访问虚拟内存的时候,就需要一个虚拟地址,这个地址是一个无符号的整数。
  比如一个32位的操作系统,他的带宽就是32,他的虚拟地址就是2的32次方,也就是说他寻址的范围就是02的32次方,这片寻址空间对应的就是2的32个字节,就是4GB,这个4GB,会有3个GB分给用户空间,会有1GB给内核系统
  在linux中,他们权限分成两个等级,0和3,用户空间只能执行受限的命令(Ring3),而且不能直接调用系统资源,必须通过内核提供的接口来访问内核空间可以执行特权命令(Ring0),调用一切系统资源,所以一般情况下,用户的操作是运行在用户空间,而内核运行的数据是在内核空间的,而有的情况下,一个应用程序需要去调用一些特权资源,去调用一些内核空间的操作,所以此时他俩需要在用户态和内核态之间进行切换。
  比如:
  Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区:写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区
  针对这个操作:我们的用户在写读数据时,会去向内核态申请,想要读取内核的数据,而内核数据要去等待驱动程序从硬件上读取数据,当从磁盘上加载到数据之后,内核会将数据写入到内核的缓冲区中,然后再将数据拷贝到用户态的buffer中,然后再返回给应用程序,整体而言,速度慢,就是这个原因,为了加速,我们希望read也好,还是waitfordata也最好都不要等待,或者时间尽量的短。
  2。网络模型2。1阻塞IO过程1:应用程序想要去读取数据,他是无法直接去读取磁盘数据的,他需要先到内核里边去等待内核操作硬件拿到数据,这个过程是需要等待的,等到内核从磁盘上把数据加载出来之后,再把这个数据写给用户的缓存区。过程2:如果是阻塞IO,那么整个过程中,用户从发起读请求开始,一直到读取到数据,都是一个阻塞状态。
  用户去读取数据时,会去先发起recvform一个命令,去尝试从内核上加载数据,如果内核没有数据,那么用户就会等待,此时内核会去从硬件上读取数据,内核读取数据之后,会把数据拷贝到用户态,并且返回ok,整个过程,都是阻塞等待的,这就是阻塞IO
  总结如下:
  顾名思义,阻塞IO就是两个阶段都必须阻塞等待:
  阶段一:用户进程尝试读取数据(比如网卡数据)此时数据尚未到达,内核需要等待数据此时用户进程也处于阻塞状态
  阶段二:数据到达并拷贝到内核缓冲区,代表已就绪将内核数据拷贝到用户缓冲区拷贝过程中,用户进程依然阻塞等待拷贝完成,用户进程解除阻塞,处理数据
  可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。
  2。2非阻塞IO
  顾名思义,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程
  阶段一:用户进程尝试读取数据(比如网卡数据)此时数据尚未到达,内核需要等待数据返回异常给用户进程用户进程拿到error后,再次尝试读取循环往复,直到数据就绪
  阶段二:将内核数据拷贝到用户缓冲区拷贝过程中,用户进程依然阻塞等待拷贝完成,用户进程解除阻塞,处理数据可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。
  2。3信号驱动
  信号驱动IO是与内核建立SIGIO的信号关联并设置回调,当内核有FD就绪时,会发出SIGIO信号通知用户,期间用户应用可以执行其它业务,无需阻塞等待。
  阶段一:用户进程调用sigaction,注册信号处理函数内核返回成功,开始监听FD用户进程不阻塞等待,可以执行其它业务当内核数据就绪后,回调用户进程的SIGIO处理函数
  阶段二:收到SIGIO回调信号调用recvfrom,读取内核将数据拷贝到用户空间用户进程处理数据
  当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致信号队列溢出,而且内核空间与用户空间的频繁信号交互性能也较低。2。4异步IO
  这种方式,不仅仅是用户态在试图读取数据后,不阻塞,而且当内核的数据准备完成后,也不会阻塞
  他会由内核将所有数据处理完成后,由内核将数据写入到用户态中,然后才算完成,所以性能极高,不会有任何阻塞,全部都由内核完成,可以看到,异步IO模型中,用户进程在两个阶段都是非阻塞状态。
  2。5IO多路复用场景引入
  为了更好的理解IO,现在假设这样一种场景:一家餐厅A情况:这家餐厅中现在只有一位服务员,并且采用客户排队点餐的方式,就像这样:
  每排到一位客户要吃到饭,都要经过两个步骤:
  思考要吃什么
  顾客开始点餐,厨师开始炒菜
  由于餐厅只有一位服务员,因此一次只能服务一位客户,并且还需要等待当前客户思考出结果,这浪费了后续排队的人非常多的时间,效率极低。这就是阻塞IO。
  当然,为了缓解这种情况,老板完全可以多雇几个人,但这也会增加成本,而在极大客流量的情况下,仍然不会有很高的效率提升B情况:这家餐厅中现在只有一位服务员,并且采用客户排队点餐的方式。
  每排到一位客户要吃到饭,都要经过两个步骤:思考要吃什么顾客开始点餐,厨师开始炒菜
  与A情况不同的是,此时服务员会不断询问顾客:你想吃番茄鸡蛋盖浇饭吗?那滑蛋牛肉呢?那肉末茄子呢?
  虽然服务员在不停的问,但是在网络中,这并不会增加数据的就绪速度,主要还是等顾客自己确定。所以,这并不会提高餐厅的效率,说不定还会招来更多差评。这就是非阻塞IO。C情况:这家餐厅中现在只有一位服务员,但是不再采用客户排队的方式,而是顾客自己获取菜单并点餐,点完后通知服务员,就像这样:
  每排到一位客户要吃到饭,还是都要经过两个步骤:看着菜单,思考要吃什么通知服务员,我点好了
  与AB不同的是,这种情况服务员不必再等待顾客思考吃什么,只需要在收到顾客通知后,去接收菜单就好。这样相当于餐厅在只有一个服务员的情况下,同时服务了多个人,而不像AB,同一时刻只能服务一个人。此时餐厅的效率自然就提高了很多。
  映射到我们的网络服务中,就是这样:客人:客户端请求点餐内容:客户端发送的实际数据老板:操作系统人力成本:系统资源菜单:文件状态描述符。操作系统对于一个进程能够同时持有的文件状态描述符的个数是有限制的,在linux系统中ulimitn查看这个限制值,当然也是可以(并且应该)进行内核参数调整的。服务员:操作系统内核用于IO操作的线程(内核线程)厨师:应用程序线程(当然厨房就是应用程序进程咯)餐单传递方式:包括了阻塞式和非阻塞式两种。方法A:阻塞IO方法B:非阻塞IO方法C:多路复用IO2。6多路复用IO的实现
  目前流程的多路复用IO实现主要包括四种:select、poll、epoll、kqueue。下表是他们的一些重要特性的比较:
  IO模型
  相对性能
  关键思路
  操作系统
  JAVA支持情况
  select
  较高
  Reactor
  windowsLinux
  支持,Reactor模式(反应器设计模式)。Linux操作系统的kernels2。4内核版本之前,默认使用select;而目前windows下对同步IO的支持,都是select模型
  poll
  较高
  Reactor
  Linux
  Linux下的JAVANIO框架,Linuxkernels2。6内核版本之前使用poll进行支持。也是使用的Reactor模式
  epoll
  高
  ReactorProactor
  Linux
  Linuxkernels2。6内核版本及以后使用epoll进行支持;Linuxkernels2。6内核版本之前使用poll进行支持;另外一定注意,由于Linux下没有Windows下的IOCP技术提供真正的异步IO支持,所以Linux下使用epoll模拟异步IO
  kqueue
  高
  Proactor
  Linux
  目前JAVA的版本不支持
  多路复用IO技术最适用的是高并发场景,所谓高并发是指1毫秒内至少同时有上千个连接请求准备好。其他情况下多路复用IO技术发挥不出来它的优势。另一方面,使用JAVANIO进行功能实现,相对于传统的Socket套接字实现要复杂一些,所以实际应用中,需要根据自己的业务需求进行技术选择。2。6。1select
  select是Linux最早是由的IO多路复用技术:
  linux中,一切皆文件,socket也不例外,我们把需要处理的数据封装成FD,然后在用户态时创建一个fdset的集合(这个集合的大小是要监听的那个FD的最大值1,但是大小整体是有限制的),这个集合的长度大小是有限制的,同时在这个集合中,标明出来我们要控制哪些数据。
  其内部流程:
  用户态下:创建fdset集合,包括要监听的读事件、写事件、异常事件的集合确定要监听的fdset集合将要监听的集合作为参数传入select()函数中,select中会将集合复制到内核buffer中
  内核态:内核线程在得到集合后,遍历该集合没数据就绪,就休眠当数据来时,线程被唤醒,然后再次遍历集合,标记就绪的fd然后将整个集合,复制回用户buffer中用户线程遍历集合,找到就绪的fd,再发起读请求。
  不足之处:集合大小固定为1024,也就是说最多维持1024个socket,在海量数据下,不够用集合需要在用户buffer和内核buffer中反复复制,涉及到用户态和内核态的切换,非常影响性能2。6。2poll
  poll模式对select模式做了简单改进,但性能提升不明显。
  IO流程:创建pollfd数组,向其中添加关注的fd信息,数组大小自定义调用poll函数,将pollfd数组拷贝到内核空间,转链表存储,无上限内核遍历fd,判断是否就绪数据就绪或超时后,拷贝pollfd数组到用户空间,返回就绪fd数量n用户进程判断n是否大于0,大于0则遍历pollfd数组,找到就绪的fd
  与select对比:select模式中的fdset大小固定为1024,而pollfd在内核中采用链表,理论上无上限,但实际上不能这么做,因为的监听FD越多,每次遍历消耗时间也越久,性能反而会下降
  2。6。3epoll
  epoll模式是对select和poll的改进,它提供了三个函数:eventpoll、epollctl、epollwaiteventpoll函数内部包含了两个东西:红黑树:用来记录所有的fd链表:记录已就绪的fdepollctl函数,将要监听的fd添加到红黑树上去,并且给每个fd绑定一个监听函数,当fd就绪时就会被触发,这个监听函数的操作就是将这个fd添加到链表中去。epollwait函数,就绪等待。一开始,用户态buffer中创建一个空的events数组,当就绪之后,我们的回调函数会把fd添加到链表中去,当函数被调用的时候,会去检查链表(当然这个过程需要参考配置的等待时间,可以等一定时间,也可以一直等),如果链表中没有有fd则fd会从红黑树被添加到链表中,此时再将链表中的的fd复制到用户态的空events中,并且返回对应的操作数量,用户态此时收到响应后,会从events中拿到已经准备好的数据,在调用读方法去拿数据。2。6。4总结:
  select模式存在的三个问题:能监听的FD最大不超过1024每次select都需要把所有要监听的FD都拷贝到内核空间每次都要遍历所有FD来判断就绪状态
  poll模式的问题:poll利用链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如果监听较多,性能会下降
  epoll模式中如何解决这些问题的?基于epoll实例中的红黑树保存要监听的FD,理论上无上限,而且增删改查效率都非常高每个FD只需要执行一次epollctl添加到红黑树,以后每次epolwait无需传递任何参数,无需重复拷贝FD到内核空间利用eppollcallback机制来监听FD状态,无需遍历所有FD,因此性能不会随监听的FD数量增多而下降2。7基于epoll的服务器端流程
  一张图搞定:
  我们来梳理一下这张图服务器启动以后,服务端会去调用epollcreate,创建一个epoll实例,epoll实例中包含两个数据红黑树(为空):rbroot用来去记录需要被监听的FD链表(为空):listhead,用来存放已经就绪的FD创建好了之后,会去调用epollctl函数,此函数会会将需要监听的fd添加到rbroot中去,并且对当前这些存在于红黑树的节点设置回调函数。当这些被监听的fd一旦准备就绪,与之相关联的回调函数就会被调用,而调用的结果就是将红黑树的fd添加到listhead中去(但是此时并没有完成)fd添加完成后,就会调用epollwait函数,这个函数会去校验是否有fd准备就绪(因为fd一旦准备就绪,就会被回调函数添加到listhead中),在等待了一段时间(可以进行配置)。如果等够了超时时间,则返回没有数据,如果有,则进一步判断当前是什么事件,如果是建立连接事件,则调用accept()接受客户端socket,拿到建立连接的socket,然后建立起来连接,如果是其他事件,则把数据进行写出。2。8五种网络模型对比:
  最后用一幅图,来说明他们之间的区别
  3。redis通信协议3。1RESP协议
  Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub):客户端(client)向服务端(server)发送一条命令,服务端解析并执行命令返回响应结果给客户端,因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。
  而在Redis中采用的是RESP(RedisSerializationProtocol)协议:Redis1。2版本引入了RESP协议Redis2。0版本中成为与Redis服务端通信的标准,称为RESP2Redis6。0版本中,从RESP2升级到了RESP3协议,增加了更多数据类型并且支持6。0的新特性客户端缓存
  但目前,默认使用的依然是RESP2协议。在RESP中,通过首字节的字符来区分不同数据类型,常用的数据类型包括5种:单行字符串:首字节是‘’,后面跟上单行字符串,以CRLF(r)结尾。例如返回OK:OKr错误(Errors):首字节是‘’,与单行字符串格式一样,只是字符串是异常信息,例如:Errormessager数值:首字节是‘:’,后面跟上数字格式的字符串,以CRLF结尾。例如::10r多行字符串:首字节是‘’,表示二进制安全的字符串,最大支持512MB:如果大小为0,则代表空字符串:0rr如果大小为1,则代表不存在:1r数组:首字节是‘’,后面跟上数组元素个数,再跟上元素,元素数据类型不限:

领取养老金资格认证在家就能办本周提醒来了!国务院提醒每周知,便民TIPS望周知!业务办理提醒事关领取养老金资格认证!在家就能办目前,各地正在有序开展2023年领取养老保险待遇资格认证工作。与往年一样,……德足协副主席国脚们像猴子一样捂嘴人们对卡塔尔的批评很虚伪直播吧1月16日讯德国足协副主席沙弗特接受媒体采访,谈到德国队在本届世界杯的表现以及对捂脸行为的看法。因FIFA表示不许佩戴彩虹袖标,德国队在对日本赛前集体捂嘴表示抗议。……出生体重仅0。95公斤,广州一位极早产儿救治成功近日,一名出生体重仅0。95公斤的极早产、超低出生体重的宝宝,在南方医科大学南方医院新生儿科呱呱坠地。超级小宝宝出生了。医院供图伴随小生命的诞生,家属们万分焦急,因……新的一年理财征途,从攒股助老说起2022年是实施攒股助老的第一个年头,其目标是通过长期参与证券市场取得正向收益,以此辅助做好家庭助老养老服务工作,并完善家庭助养体系。补充说一句,攒股助老计划获得了胞兄们的大力……含银量上升公募基金银行股持仓比例提升至3,城商行成香饽饽21世纪经济报道记者叶麦穗广州报道公募基金四季报已经全部披露完毕。根据同花顺统计,去年四季度公募基金整体规模为25。74万亿元,马太效应明显,前十大管理人合计规模为10。……韦世豪没来泰山,他的接班人却来了,广州队当红国脚抵达济南在中超联赛进入到休赛期后,山东泰山还是非常活跃的,不断有国脚级别的球员与泰山队传出绯闻,另外最近还因为吴兴涵和戴琳的丑闻事件,再次让泰山队成为了外界关注的焦点,接下来泰山队急需……皮肤护理手肘私处发黑的有效改善方法你是否厌倦了膝盖和肘部的黑色皮肤斑块?手肘和膝盖的这些凸起的部位发黑,千万不要用搓澡巾使劲去搓,有的人觉得这里黑了,我使劲搓是不是可以把这个黑把它搓掉,千万不要这么……悦读有关快递路径规划分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard学苑。今天小编为你带来互联网背景下农村物流发展可视化分析,欢迎您的访问!Sha……为什么越南女子要身穿奥黛?不仅好看,还可以满足游客需要越南是东南亚极具异域风情的国家,旅游资源丰富,物价水平低,深受海外游客欢迎。(此处已添加小程序,请到今日头条客户端查看)每年到越南旅行的中国游客占据大多数,中国游客也为越……让孩子玩中学,学中玩的爱不释手的游戏书现代儿童心理学家让皮亚杰提出了玩中学、学中玩的教育理论,这也是一种全新的教育方式,玩耍是孩子的天性,这种寓教于乐的教育理念,让孩子在玩耍中快乐学习,从而培养孩子的学习兴趣。……优质大屏,视野不受限,TCL电视让观影更畅快长时间不看电视的我,对电视的印象还停留在遥控操作,高度动态画面容易卡顿雪花,但是没想到装修新家时入手的这款TCL金属全面屏巨幕电视,刷新了我对传统电视的认知,超高清的画质,饱满……长津湖票房35亿,央媒发文易烊千玺打破一个无人匹及的成就今年的国庆档已经迎来尾声,战争大片《长津湖》以断崖式的票房优势持续领跑,票房总数已经突破了35亿大关。除此之外,《长津湖》还成为中国影史上首部连续6天票房破4亿的电影,俨然创下……
斯帕莱蒂好奇奥斯梅恩未来会到什么高度,球迷助我们拿下比赛直播吧1月14日讯今天凌晨,那不勒斯在意甲联赛中51大胜尤文图斯,赛后斯帕莱蒂接受了媒体采访。斯帕莱蒂说道:这是一个美妙的夜晚,因为球队踢得非常好,并保持了高强度节奏,这……海信集团总会计师刘鑫是顶级财务专家科班出身成长挺快如今也年轻运营商财经网实习生贠盈盈文去年年底,海信内部发文表示,林澜辞去海信集团董事长职务,集团总裁贾少谦接任。值得一提的是,这已经是海信连续两年高层变动,而这些变动中,担任海信集……果粉安卓党必看!2023换机思路浅析,这么选才是最优解进入2023年以来,手机市场就变得异常热闹,不同价位新机频发,让很多朋友开始真正思考,是继续凑合使用老手机,还是追求更优质的性能、影像体验?就目前而言,受众较大的用户主要集中在……女排欧联杯半决赛,斯坎迪奇30胜土耳其航空,华盛顿获单场MV北京时间3月15日凌晨,20222023女排欧联杯半决赛首场比赛在斯坎迪奇主场进行,结果斯坎迪奇30战胜了土耳其航空队,三局的比分是2725、2512、2518。斯坎迪奇副攻华……广东增城金叶子温泉酒店扛不住了,4房独栋别墅白菜价,值得一去【广州增城金叶子半山温泉酒店】4房独栋别墅仅需999,可住12人,享酒店自助早餐私家温泉公共温泉自动麻将点开作者的头像,再点击【活动资讯】,搜索关键词金叶子预定这里……创新进展北科院分析测试研究所先进材料及原位表征实验室在绿色低近日,北京市科学技术研究院分析测试研究所先进材料及原位表征实验室刘向文博士团队与清华大学团队、奥克兰大学团队共同合作,在绿色低碳领域取得了新进展,通过设计、合成PdCu3N负离……余承东恐被查处,若离职或能再造一个华为?近日,华为内部高层的表态,让余承东造车梦彻底宣布破灭!试想下,如果余承东因此选择离职创业,选择新能源汽车方向,也不是没有可能再造一个华为的体量。以汽车平均单价30w的来算……你最喜欢喝的中国茶叶是哪一种?作为中国文化的重要组成部分,茶叶有着悠久的历史和博大的文化内涵。茶叶的种类繁多,各有不同的口感、香气和功效。我最喜欢喝的中国茶叶是铁观音,下面就详细介绍一下。铁观音是中国……央行强化流通中现金服务管理,提高货金保卫工作规范化水平北京商报讯(记者廖蒙)4月6日,据央行官网披露,央行于4月4日召开2023年货币金银和安全保卫工作电视会议。会议要求,2023年央行货金保卫系统要深刻把握中国式现代化的理论体系……掘金淘汰出局后考辛斯悲观发文,将考虑退役,NBA没球队要他了首轮面对勇士,即便是上赛季拿到常规赛MVP的约基奇也打的一点脾气都没有,最终被对手41淘汰出局。赛季中期加盟的考辛斯也在掘金逐渐打出状态,今天替补出场的他砍下19分,但是赛后考……男人三更半夜睡不着,多半是想女人了三更半夜睡不着,我想女人了,通常我会吟诗一首,于是枕边摆了一堆草稿纸,柔软亲肤的那种草稿纸!!随便抽出一张,只见上面写着:《夜思佳人》午夜漆黑而凄惨无尽……中国点名美光,外媒美国把事情闹大了自从美国宣布修改芯片规则,加强对华为等中企的技术出口管控后,全球各大半导体企业都显得很无奈。以台积电为例,华为是它的第二大客户,每年为其创造了数百亿的利润,但是,美国突然禁止使……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网