首页 > 数据库 >redis高频问题--redis单线程

redis高频问题--redis单线程

时间:2024-02-19 17:35:03浏览次数:36  
标签:Socket -- redis 用户 阻塞 单线程 内核 IO 进程

redis单线程

问题引入

● Redis是纯内存操作, 执行速度非常快
● 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题
● 使用I/O多路复用模型, 非阻塞IO

Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,I/O多路复 用模型主要就是实现了高效的网络请求
● 用户空间和内核空间
● 常见的IO模型
➢ 阻塞IO (Blocking I0)
➢ 非阻塞IO (Nonblocking I0)
➢ I0多路复用(IO Multiplexing)
●Redis网络模型

用户空间与内核空间

● Linux系统中一 -个进程使用的内存情况划分两部分:内核空间、用户空间
● 用户空间只能执行受限的命令(Ring3) ,而且不能直接调用系统资源
必须通过内核提供的接口来访问
● 内核空间可以执行特权命令(Ring0) ,调用一-切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区:
● 写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备
● 读数据时, 要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区

阻塞IO与非阻塞IO

阻塞IO就是两个阶段都必须阻塞等待:

阶段一:
1.用户进程尝试读取数据 (比如网卡数据)
2.此时数据尚未到达,内核需要等待数据
3.此时用户进程也处于阻塞状态

阶段二:
1.数据到达并拷贝到内核缓冲区,代表已就绪
2.将内核数据拷贝到用户缓冲区
3.拷贝过程中,用户进程依然阻塞等待
4.拷贝完成,用户进程解除阻塞,处理数据

阻塞IO模型中,用户进程在两个阶段都是阻塞状态。

非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。

阶段一:
1.用户进程尝试读取数据(比如网卡数据)
2.此时数据尚未到达,内核需要等待数据
3.返回异常给用户进程
4.用户进程拿到error后,再次尝试读取
5.循环往复,直到数据就绪

阶段二:
将内核数据拷贝到用户缓冲区
拷贝过程中,用户进程依然阻塞等待
拷贝完成,用户进程解除阻塞,处理数据

可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。

IO多路复用

IO多路复用:是利用单个线程来同时监听多个Socket(客户端的连接),并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

阶段一:
1.用户进程调用select,指定要监听的Socket集合
2.内核监听对应的多个socket
3.任意一个或多个socket数据就绪则返回readable
4.此过程中用户进程阻塞

阶段二:
1.用户进程找到就绪的socket
2.依次调用recvfrom读取数据
3.内核将数据拷贝到用户空间
4.用户进程处理数据

IO多路复用(Linux系统)是利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。不过监听Socket的方式、通知的方式又有多种实现,常见的有:
select、poll、epoll

差异:
1.select和poll只会通知用户进程有Socket就绪,但不确定具体是哪个Socket,需要用户进程逐个遍历Socket来确认
2.epoll则会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间

点餐案例(select、poll ):每个顾客可以通过自己的开关进行点灯,灯亮的时候服务员就去一个一个去询问,确定是谁点灯
点餐案例(epoll ):每个顾客可以控制服务员的计算机,客户按下按钮,计算器中显示几号桌就绪

Redis网络模型

Redis通过IO多路复用来提高网络性能,并且支持各种不同的多路复用实现,并且将这些实现进行封装,提供了统一的高性能事件库

redis的网络模型=IO多路复用+事件派发,对应不同的事件给不同的处理器。

问题总结

面试问答

————————————————
原文链接:https://blog.csdn.net/qq_48592827/article/details/132697109

标签:Socket,--,redis,用户,阻塞,单线程,内核,IO,进程
From: https://www.cnblogs.com/xiaolibiji/p/18021559

相关文章

  • STL简介
    01.STL的介绍(重点)1.STL(StandardTemplateLibrary,标准模板库)2.STL提供了六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器​ 容器:各种数据结构​ 算法:各种常用的算法(冒泡,排序)​ 迭代器:扮演了容器与算法之间的胶合剂(类似于指针等)​ 仿函数:行为类似函数,可作为算法的某种策略......
  • tultlebot3仿真
    1.启动仿真世界:roslaunchturtlebot3_gazeboturtlebot3_world.launch2.启动gmapping建图节点roslaunchturtlebot3_slamturtlebot3_slam.launchslam_methods:=gmapping3.启动小车键盘控制节点,控制小车移动:roslaunchturtlebot3_teleopturtlebot3_teleop_key.launch分别安wa......
  • 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件
    前天尝试通过one-api+dashscope(阿里云灵积)+qwen(通义千问)运行SemanticKernel插件(Plugin),结果尝试失败,详见前天的博文。今天换一种方式尝试,选择了一个旁门左道走走看,看能不能在不使用大模型的情况下让SemanticKernel插件运行起来,这个旁门左道就是从StephenToub那......
  • 云原生明星创业公司 Weaveworks 倒闭了,GitOps 该何去何从?
    自从2009年DevOps面世以来,xOps的潘多拉魔盒就被打开了,AIOps、DataOps、DevSecOps、BizDevOps,当然还有最近几年比较火热的GitOps。但是很不幸的是,就在龙年新春前夕,GitOps理论提出者——Weaveworks倒下了。时间回到2月5日,就在大家期待春节长假的时候,一则Weaveworks......
  • 研究性学习
    关于该课题\(\hspace{0.5cm}\)在之前遇到过像这样的说法,将\(\frac{e^x-e^{-x}}{2}\)和\(\frac{e^x+e^{-x}}{2}\)类比于三角函数。它们和正弦余弦函数具有许多相似的地方,例如“和角公式”“和差化积”等等,性质几乎一模一样,于是便思考这是否等价于三角函数呢?但是......
  • 知识汇总2
    树状数组——高效求前缀和(直接放板子了。。)下标点击查看代码intlowbit(intx){ returnx&(-x);}单点修改点击查看代码voidadd(inti,intk){ while(i<=n){ c[i]^=k; i+=lowbit(i); }}求和点击查看代码intgetsum(intl){ intres1=0; while(l>0){......
  • 2月17日spark实验2 Scala 语言基础
    计算级数请用脚本的方式编程计算并输出下列级数的前n项之和Sn,直到Sn刚好大于或等于q为止,其中q为大于0的整数,其值通过键盘输入。例如,若q的值为50.0,则输出应为:Sn=50.416695。请将源文件保存为exercise2-1.scala,在REPL模式下测试运行,测试样......
  • Sasha and a Walk in the City
    先写一下官方题解首先原问题有一个很显然的解集:点集中任意两点不存在祖孙关系所以我们令\(f[v]\)表示以\(v\)为根的子树的点集的数目,这些点集中任意两点不存在祖孙关系有如果一个解集中有一个点是另一个点的祖先,我们画出图那么这个点上面的点(包括这些点的分支)是肯定不能选......
  • 服务器终端命令记录
    1.查看文件大小#默认显示[Linux]$du#以人类可读的方式显示[Linux]$du-h#按大小排列[Linux]$du-h|sort-nr#只显示Images文件夹的大小[Linux]$du-hImages/#只显示当前文件夹的总大小[Linux]$du-hs2.查看服务器节点数:sinfo3.提交运行命令:sbatch......
  • tomcat日志文件按日期生成
    tomcat日志文件按日期生成有时候想查一下日志看看什么问题,发现tomcat的catalina.out日志很大,很不方便,so安装cronolog互联网服务器,直接安装yuminstallcronolog查询cronolog路径:whichcronolog/usr/sbin/cronolog修改catalina.sh文件注释touch"\(CATALINA_OUT"找到"\)C......