redis为什么那么快?结论有三点,大家都知道,这里主要是分析。
redis为什么那么快?结论有三点,大家都知道,这里主要是分析。
首先第一点
redis是内存访问的,所以快
当然这个大家都知道,所以不是重点
1|0io密集型和cpu密集型
一般我们把任务分为io密集型和cpu密集型
1|1io密集型
IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
对于io密集型的任务,它的主要时间都在磁盘io上,而io本身在发出中断告知cpu后,cpu只需要短暂的处理一下,之后就由DMA(详见附录)负责数据传输,整个过程对cpu的利用率很低。因此我们需要开更多的线程去充分利用cpu。即一般线程数 = cpu核心数 * 2,如数据库连接池
1|2cpu密集型
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
对于cpu密集型的任务,它对cpu的利用率很高,所以不需要开更多的线程去提高cpu利用率。假如增加线程,只会引起线程的频繁切换导致本来就不够用的cpu更加不够用。所以一般是线程数 = cpu核心数 + 1
2|0redis的瓶颈在哪里
redis基本都在进行内存io,那它的瓶颈在io上吗?
redis在网络io上使用epoll实现了一个io多路复用的reactor模型,epoll是非阻塞io,所以避免了cpu阻塞在io上,所以它不是io密集型,瓶颈不在于等待io导致cpu利用率不高,不需要多个线程来屏蔽等待io执行完成的时间。当然redis的io利用率很高,但是io利用率高并不代表它是io密集型,因为它瓶颈不在等待io上。
所以第二点
redis在网络io上使用epoll实现了一个io多路复用的reactor模型使得cpu利用率更高,浪费在io上的时间更少
redis并不需要多线程来提高cpu利用率减少io等待时间,并且单线程架构也比较容易实现,所以顺理成章就采用了单线程架构。
关于epoll可以看我的这篇文章:https://www.cnblogs.com/fatmanhappycode/p/12362423.html
第三点
由于采用了单线程架构,避免了线程线程切换产生的消耗
因为一次CPU上下文的切换大概在 1500ns 左右。
从内存中读取 1MB 的连续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,
那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据 的时间
那么redis是cpu密集型吗?答案是否定的。
redis也不是cpu密集型。大多数情况下redis机器上的cpu是很够用的。
redis的瓶颈在于内存大小和网络带宽。
如果想要更充分的利用多核cpu,可以采用多个redis实例的方法,同时为了减少线程争用,可以将实例和cpu绑定的方法。
但是如果做了CPU绑定,在rdb和aof时子进程会与父进程共享使用一个CPU。子进程重写时对单核CPU使用率通常在90%以上,父进程与子进程将产生激烈CPU竞争,极大影响Redis稳定性。(解决方法不清楚,也许多绑定一个CPU会好点?)
3|0附录
3|1DMA
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。
典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。例如内存移到磁盘。
最后惯例附一图:
参考资料:
https://www.php.cn/redis/422123.html
https://blog.csdn.net/youanyyou/article/details/78990156
本文作者:肥宅快乐码
本文链接:https://www.cnblogs.com/fatmanhappycode/p/12708861.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Apache Hudi 设计与架构最强解读
Apache Hudi 设计与架构最强解读 感谢 Apache Hudi contributor:王祥虎翻译&供稿。 欢迎关注微信公众号:ApacheHudi 本文将介绍Apache Hudi的基本概念、设计以及总体基础架构。 1.简介Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。这两种原语分别是: Update/Delete记录:Hudi使用细粒度的文件/记录级别索引来支持Update/Delete记录,同时还提供写操作的事务保证。查询会处理最后一个提交的快照,并基于此输出结果。变更流:Hudi对获取数据变更提供了一流的支持:可以从给定的时间点获取给定表中已updated/inserted/deleted的所有记录的增量流,并解锁新的查询姿势(类别)。 这些原语紧密结合,解锁了基于DFS抽象的流/增量处理能力。如果您熟悉流处理,那么这和从kafka主题消费事件,然后使用状态存储逐步累加中间结果类似。这在架构上会有以下几点优势:1)效率的提升:摄取数据通常需要...
- 下一篇
(完结篇)Python框架FastAPI:比Flask和Tornada更高性能的API 框架
0 前言 前几天给大家分别分享了(入门篇)简析Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架和(进阶篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架。今天欢迎大家来到 FastAPI 系列分享的完结篇,本文主要是对于前面文章的补充和扩展。 当然这些功能在实际开发中也扮演者极其重要的角色。 1 中间件的使用 Flask 有 钩子函数,可以对某些方法进行装饰,在某些全局或者非全局的情况下,增添特定的功能。 同样在 FastAPI 中也存在着像钩子函数的东西,也就是中间件 Middleware了。 计算回调时间 -- coding: UTF-8 -- import timefrom fastapi import FastAPIfrom starlette.requests import Request app = FastAPI() @app.middleware("http")async def add_process_time_header(request: Request, call_...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19