redis server多路复用机制是什么?

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术 本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。 阅读详情

redis server多路复用机制是什么?相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说,一起往下看吧。
redis server 启动时调用bind() 传入文件描述符fd6 绑定端口6379,调用listen()监听端口,并通过accept() 等待连接
root@pmghong-VirtualBox:/usr/local/redis/bin#strace-ff-o/data/redis_strace/redis./redis-serverroot@pmghong-VirtualBox:/proc/22330/fd#ls/data/redis_strace/-ltotal48-rw-r--r--1rootroot347413月1410:37redis.25102-rw-r--r--1rootroot1343月1410:37redis.25105-rw-r--r--1rootroot1343月1410:37redis.25106-rw-r--r--1rootroot1343月1410:37redis.25107root@pmghong-VirtualBox:/proc/22330/fd#vi/data/redis_strace/redis.25102......epoll_create(1024)=5socket(PF_INET6,SOCK_STREAM,IPPROTO_TCP)=6setsockopt(6,SOL_IPV6,IPV6_V6ONLY,[1],4)=0setsockopt(6,SOL_SOCKET,SO_REUSEADDR,[1],4)=0bind(6,{sa_family=AF_INET6,sin6_port=htons(6379),inet_pton(AF_INET6,"::",&sin6_addr),sin6_flowinfo=0,sin6_scope_id=0},28)=0listen(6,511)=0fcntl(6,F_GETFL)=0x2(flagsO_RDWR)fcntl(6,F_SETFL,O_RDWR|O_NONBLOCK)=0......root@pmghong-VirtualBox:/proc/25102/fd#lltotal0dr-x------2rootroot03月1412:05./dr-xr-xr-x9rootroot03月1410:37../lrwx------1rootroot643月1412:280->/dev/pts/0lrwx------1rootroot643月1412:281->/dev/pts/0lrwx------1rootroot643月1412:052->/dev/pts/0lr-x------1rootroot643月1412:283->pipe:[104062]l-wx------1rootroot643月1412:284->pipe:[104062]lrwx------1rootroot643月1412:285->anon_inode:[eventpoll]lrwx------1rootroot643月1412:286->socket:[104063]lrwx------1rootroot643月1412:287->socket:[104064]lrwx------1rootroot643月1412:288->socket:[256344]第一阶段:BIO(阻塞IO)

Redis Server 启动后通过文件描述符fd6 监听系统内核
Client1 / Client2 分别通过fd7,fd8 请求访问redis
在BIO的场景下,redis server 会调用read()方法并进入阻塞状态,也就是直到fd7 有请求过来,处理完才能处理其他请求
这个模式缺点很明显,就是阻塞IO导致效率低
第二阶段 NIO (非阻塞IO)

跟BIO的区别在于,调用read(fd7) 时,如果没有请求数据,立即给redis server 返回一个错误
redis server 收到该类型的错误即可知道当前连接没有数据过来,可以继续处理下一个请求,提高处理效率
bind(6,{sa_family=AF_INET6,sin6_port=htons(6379),inet_pton(AF_INET6,"::",&sin6_addr),sin6_flowinfo=0,sin6_scope_id=0},28)=0listen(6,511)=0fcntl(6,F_GETFL)=0x2(flagsO_RDWR)fcntl(6,F_SETFL,O_RDWR|O_NONBLOCK)=0该模式的问题在于,定时轮询调用read(fdx)系统调用,当多个client 请求过来时,需要频繁的进行内核态/用户态切换,上下文切换开销大
第三阶段 select 同步非阻塞

intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);select()andpselect()allowaprogramtomonitormultiplefiledescriptors,waitinguntiloneormoreofthefiledescriptorsbecome"ready"forsomeclassofI/Ooperation(e.g.,inputpossible).AfiledescriptorisconsideredreadyifitispossibletoperformacorrespondingI/Ooperation(e.g.,read(2)withoutblocking,orasufficientlysmallwrite(2)).目标是同时监听多个fd,直到一个或者多个fd 进入ready 状态,才会调用read()等系统调用处理业务逻辑,而不像上述的NIO场景下,需要轮询调用x个read()
select 只能解决事件通知问题(即哪些进程能读,哪些不能读的问题),但到了内核态,仍需在内核中遍历x个fd,看哪个client 发生了IO,再通知select 把结果集返回给server端,接着由sever端向指定的fd发起read() 系统调用
第四阶段 epoll 多路复用

epoll 机制包括 epoll_create / epoll_ctl / epoll_wait 3个系统调用
//epoll_create//说明epoll_create()createsanepoll(7)instance.//函数签名intepoll_create(intsize);//返回值Onsuccess,thesesystemcallsreturnanonnegativefiledescriptor.Onerror,-1isreturned,anderrnoissettoindicatetheerror.//epoll_ctl//说明Thissystemcallperformscontroloperationsontheepoll(7)instancereferredtobythefiledescriptorepfd.Itrequeststhattheoperationopbeper‐formedforthetargetfiledescriptor,fd.//函数签名intepoll_ctl(intepfd,intop,intfd,structepoll_event*event);//op类型EPOLL_CTL_ADD/EPOLL_CTL_MOD/EPOLL_CTL_DEL//返回值Whensuccessful,epoll_ctl()returnszero.Whenanerroroccurs,epoll_ctl()returns-1anderrnoissetappropriately.//epoll_ctl//说明Theepoll_wait()systemcallwaitsforeventsontheepoll(7)instancereferredtobythefiledescriptorepfd.Thememoryareapointedtobyeventswillcontaintheeventsthatwillbeavailableforthecaller.Uptomaxeventsarereturnedbyepoll_wait().Themaxeventsargumentmustbegreaterthanzero.//函数签名intepoll_wait(intepfd,structepoll_event*events,intmaxevents,inttimeout);//返回值Whensuccessful,epoll_wait()returnsthenumberoffiledescriptorsreadyfortherequestedI/O,orzeroifnofiledescriptorbecamereadyduringtherequestedtimeoutmilliseconds.Whenanerroroccurs,epoll_wait()returns-1anderrnoissetappropriately.epoll_create(1024)=5......bind(6,{sa_family=AF_INET6,sin6_port=htons(6379),inet_pton(AF_INET6,"::",&sin6_addr),sin6_flowinfo=0,sin6_scope_id=0},28)=0listen(6,511)=0......bind(7,{sa_family=AF_INET,sin_port=htons(6379),sin_addr=inet_addr("0.0.0.0")},16)=0listen(7,511)=0......epoll_ctl(5,EPOLL_CTL_ADD,6,{EPOLLIN,{u32=6,u64=6}})=0epoll_ctl(5,EPOLL_CTL_ADD,7,{EPOLLIN,{u32=7,u64=7}})=0epoll_ctl(5,EPOLL_CTL_ADD,3,{EPOLLIN,{u32=3,u64=3}})=0write(...)read(...)epoll_wait(5,[],10128,0)=01、进程启动时通过epoll_create() 创建epoll instance,成功时返回一个非负数的fdn,失败返回-1还有错误码
2、调用epoll_ctl(上一步epoll_create 返回的fd,op,fd6,事件类型<accpet>)
3、调用epoll_wait() 监听内核事件,调用成功时返回该fd。例如当c1请求redisserver 时,首先需要通过fd6建立连接,此时通过epoll_ctl() 中对fd6 的accept()调用可以监听到该请求,并将fd6传给epoll_wait()
4、redis server端 从epoll_wait() 获取需要IO操作的fd,发现c1 通过fd6请求建立连接,为其分配fd7,并在epoll_ctl()注册一个监听,例如epoll_ctl(fdn,op, fd7, <read>)
更多相关知识点文章:
redis多路复用原理是什么以及常见问题有哪些
redis多路复用技术的示例分析
看完上述内容,你们对redis server的多路复用机制大概了解了吗?

CN2线路是指中国电信推出的新一代承载网络,它可以支持数据、语音、视频等多种业务融合的应用,CN2线路的全球IP骨干网具有高弹性、高冗余性和低延迟性的特点。

OJ(while+cin.get()判断结束) 今天要记录一道看起来十分简单的OJ题目,但开始对于cin的一些操作忘得差不多了,没做出来,故记下来给自己提个醒。 描述 给出包含N个单词的一行输入,输出N行。第一行和输入一样。每次输出过一行后,这一行的第一个单词在下一行被放到最后。 输入 包含N个单词的字符串,单词以一个空格分开。N不在输入中给出,你需要计算单词的数量来获得。字符串包含的字符数小于100。 输出 输出N行。... 阅读详情

相关推荐

手把手教你用STM32单片机控制双向可控硅调光(附完整代码+电路图)

本文提供了一套完整的STM32单片机控制双向可控硅实现灯光无级调光的实战方案。详细讲解了硬件电路设计,包括过零检测与隔离驱动,并剖析了基于定时器中断的软件核心逻辑,通过精准的相位角计算实现平滑的灯光强度控制。附有完整代码与电路图,适合嵌入式开发者实践。

weixin_29194255的博客 862

L6网络编程--IO多路复用(day6)

目录一、I/O模型二、阻塞I/O模式 :1、读阻塞 2、写阻塞 三、非阻塞模式I/O1、非阻塞模式的实现fcntl()函数四、多路复用I/O 基本常识: 多路复用服务器模型:​编辑 select()/poll()实现多路复用函数拓展:strncasecmp()函数:比较字符串的前n个字符​编辑在客户端端采用select来实现客户端的多路并发 day6作业:答:第一问 :参考第二问:参考IO 多路复用 之 (select/poll/epoll) (element-ui.cn)http://element-ui

楚子航 1256

Qlib上手学习记录

Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持多种机器学习建模范式,包括有监督学习、市场动态建模以及强化学习等。真的是走了很多弯路step 1. 使用 ananconda 建立环境,要主要必须是 python 3.8失败的下了以后 进入 glib folder 后执行是会报错的,不管你还什么source 都一样,整了很久使用前最好看下这个。

chenchihwen的专栏 3078

redis I/O多路复用机制

所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现。优点:就是这种方式非常容易让人理解,写起代码来非常的自然,符合人的直线型思维。

天天新知 2212

Redis多路复用机制

当我们客户端向他注册事件的时候,调的就是这个接口。注册进来之后,假如我发了数据过来,触发了一个IO事件,那么这个时候selector会返回翻一个事件的数组,一个集合两个events,然后由我们的redis把这两个events的数据拿到之后进行处理。这些在Linux操作系统里提供了相应的函数,比方说我们要创建一个收集器或者叫多路复用神器,我们会去调用操作系统的epoll_create这个函数,来声明一个事件收集器的一个内存空间,专门用来存很多事件的,来感知有没有事件发生调epoll_create。

qq_46130027的博客 571

Redis】IO多路复用机制

IO多路复用机制

芝兰生于深谷,不以无人而不芳 4981

Redis 多路复用

Redis 多路复用

旷野历程 4657

基于社区电商场景的Redis缓存架构实战01-redis内核知识

当你手头有大量的客户端来并发访问的时候,server端里就可能会有大量的socket 可以多个线程,也可以一个线程,bio模式下,一个socket连接,server端就对应了一个线程来进行监听他的请求,java nio模式下,可以实现IO多路复用,一个线程,就可以多路复用去监听多个socket 的网络事件(请求发送过来)redis基于文件事件的网络通信模型 file event,网络事件,抽象为文件事件,在redis server内部,网络通信各种事件,其实都是一些文件事件 Socket 概念。

iNiBuBian的博客 416

Redis事件驱动框架(上):何时使用select、poll、epoll?

你好,我是程序员贵哥。Redis作为一个Client-Server架构的数据库,其源码中少不了用来实现网络通信的部分。而你应该也清楚,通常系统实现网络通信的基本方法是,包括创建Socket、监听端口、处理连接请求和读写请求。但是,由于基本的Socket编程模型一次只能处理一个客户端连接上的请求,所以当要处理高并发请求时,一种方案就是使用多线程,让每个线程负责处理一个客户端的请求。

qq_33240556的博客 824

数据库Redis数据库

Redis(远程字典服务器) 是一个开源的、使用 C 语言编写的 NoSQL 数据库即非关系数据库Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。2、Redis命中机制和淘汰机制

qiuyuyiyang的博客 365

每次面试都要被问:为什么采用单线程的Redis也会如此之快?

在文章开头已经特别说明,Redis Server本身是多线程的,除了请求处理流程是单线程处理之外,Redis内部还有其他工作线程在后台执行,它负责异步执行某些比较耗时的任务,例如AOF每秒刷盘、AOF文件重写都是在另一个线程中完成的。在删除大key时,释放内存往往都比较耗时,所以Redis提供异步释放内存的方式,让这些耗时的操作放到另一个线程中异步去处理,从而不影响主线程的执行,提高性能。Redis是一个内存数据库,它的数据都存储在内存中,这意味着我们读写数据都是在内存中完成,这个速度是非常快的。

2501_90425418的博客 440

分布式数据库Redis的简介、安装与设置使用指令

RedisRedis的简介Redis的安装下载安装包安装包安装安装成功的标志Redis的使用 Redis的简介 全称Remote Dictionary Server,即远程字典服务。Redis是通过Key-Value来存储数据的开源数据库Redis由VMware主持开发,遵守 BSD 协议,使用C语言按照ANSI C标准进行开发的。 ANSI C标准: Redis提供多种语言的API 不仅支持key-value的数据,同时还提供list,set,zset,hash等数据结构的存储 支持数据的备份 支

u010804417的博客 1964

Redis技术知识总结之七——Redis多路复用机制

接上篇《Redis技术知识总结之六——Redis持久化机制》 七. Redis 多路复用机制 参考地址:《Redis IO多路复用技术以及epoll实现原理》 redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统。 redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。 为什么 Redis 中要使用 I/O 多路复用这种技术呢? 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O .

琦小虾的代码世界 2275

Redis IO多路复用原理与优化

在当今大数据时代,Redis作为一款高性能的内存数据库,被广泛应用于缓存、消息队列等领域。然而,在Redis的高性能背后,IO多路复用技术起到了至关重要的作用。本文将围绕“Redis知识点之IO多路复用:概述”这一主题,深入探讨IO多路复用的概念、重要性以及应用场景。在实际应用中,我们常常会遇到这样的场景:一个Redis服务器需要同时处理大量客户端的请求,如果采用传统的IO模型,每个客户端请求都需要创建一个线程进行处理,这将导致服务器资源消耗巨大,性能低下。而IO多路复用技术正是为了解决这一问题而诞生的。

我是Java程序员廖志伟,感谢朋友们的支持! 1237

Redis篇——超详细、超细节I/O多路复用介绍,回答Redis为什么单线程这么快!涵盖阻塞I/O模型、Linux内核空间以及Redis网络模型等常见技术点,一篇文章帮你彻底拿下!

redis为什么能够在单线程的情况下,轻松应对高并发的访问,Redis提供的I/O多路复用功不可没!Redis 使用 I/O 多路复用来处理连接,这意味着它不会为每个连接创建一个新的线程。而是使用一个主线程来监听多个连接,并在需要时进行处理。这种设计减少了线程切换的开销,并允许 Redis 在高并发场景下保持高性能。补充一下其他的帮助redis处理高并发请求的小帮手!事件驱动:Redis 使用事件驱动模型来处理请求。它监听套接字的 I/O 事件,一旦有数据可用,就立即处理。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 5662

IO模型及IO多路复用模型详解

io模型、redis的io多路复用模型、redis为什么用io多路复用模型

jxliu的博客 3610

Redis的IO多路复用机制

Redis中,IO多路复用是一种技术,允许单个线程处理多个网络连接。它利用了select、poll、epoll等机制,能够同时监视多个描述符(fd),一旦某个描述符就绪(读/写/异常),就能通知程序进行相应的读写操作。这种技术可以避免大量的无用操作,因为在空闲的时候,会将当前线程阻塞掉。当有一个或多个流有I/O事件时,就从阻塞态中唤醒,程序会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),依次顺序的处理就绪的流。

2301_80100731的博客 1400

基于51单片机的温度控制(PT100,上下限,数码管)proteus,原理图、流程图、物料清单、仿真图、源代码

基于51单片机的温度控制(PT100,上下限,数码管)proteus,原理图、流程图、物料清单、仿真图、源代码基于51单片机的温度控制(PT100,上下限,数码管)1、用4位共阳数码管作为显示器件2、用独立按键作为输入器件,能够对温度上下限进行设置3、通过PT100传感器测量温度4、温度高于上限,启动散热。温度低于下限,启动加热

CC1101收发驱动程序(MiniSTM32通过测试)_CC1101_源码.zip

CC1101收发驱动程序(MiniSTM32通过测试)_CC1101_源码.zip

上一篇: prometheus常见表达式有哪些
下一篇: rsync+inotify实现数据实时同步备份
Vecloud
博客等级 码龄6年 97粉丝 243原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值