从IO操作与多线程的思考到Redis-6.0

IO操作->线程阻塞->释放CPU资源->多线程技术提升CPU利用率

        在没有涉及磁盘操作和网络请求的程序中,通常不会出现线程等待状态。线程等待状态通常是由于线程需要等待某些事件的发生,比如I/O操作完成、网络请求返回等。如果程序只是进行计算或者简单的逻辑处理,并且没有明显的阻塞点,那么线程通常会一直运行而不会被挂起等待。

        然而,即使是在纯计算的程序中,也可能出现线程等待状态。例如,当一个线程尝试获取一个已经被其他线程获取的锁时,它会进入等待状态,直到锁可用为止。另外,有些程序可能会使用线程间的通信机制(比如 wait/notify 或者 CountDownLatch),这些机制也可能导致线程进入等待状态。

        总的来说,在没有涉及磁盘和网络操作的程序中,线程等待状态的出现取决于程序本身的设计和实现,以及是否涉及到需要线程等待的场景。

从多线程到Redis

        综上,如果在一台没用多线程技术的单核CPU上执行一个程序,程序没有IO操作,那么使用多线程进行程序处理其实收益就不大了。此时使用多线程技术,还需考虑资源并发安全、线程调度切换开销,会比使用单线程处理程序更慢。比如,两个逻辑每个都需要cpu执行1000ms,如果使用2个线程并行处理,那么两个逻辑都执行完毕的总时长可能大于2000ms。

        从上述现象上看,也能理解为何Redis6.0之前主流逻辑都采用单线程,也明白了为何6.0以后,在网络数据处理上使用了多线程模型。

        6.0 关于线程数的设置,官方的建议是如果为 4 核的 CPU,建议线程数设置为 2 或 3,如果为 8 核 CPU 建议线程数设置为 6,线程数一定要小于机器核数,线程数并不是越大越好。

        虽然 Redis 的主要工作(网络 I/O 和执行命令)一直是单线程模型,但是在 Redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 I/O 的处理上(网络通道性能提升了,但是碍于之前的单线程串行读写太少)。所以为了提高网络请求处理的并行度,Redis 6.0 对于网络请求采用多线程来处理。但是对于命令执行,Redis 仍然使用单线程来处理。

  • Redis-server :Redis的主线程,主要负责执行命令;
  • bio_close_file、bio_aof_fsync、bio_lazy_free:三个后台线程,分别异步处理关闭文件任务、AOF刷盘任务、释放内存任务;
  • io_thd_1、io_thd_2、io_thd_3:三个 I/O 线程,io-threads 默认是 4 ,所以会启动 3(4-1)个 I/O 多线程,用来分担 Redis 网络 I/O 的压力。

        如上图,IO线程池的使用是让图中0.005s跟0.01s耗时的操作不再串行,而是提升cpu资源利用率提升redis的整体访问并发性能。因为网络硬件传输性能的提升,可以支持Redis进行并发网络IO操作了。如下图:

好文推荐

正式支持多线程!Redis 6.0与老版性能对比评测 - 知乎

Redis 6.0 多线程性能测试结果及分析 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

低代码开发平台开源:依靠科技力量实现数字化转型!

在竞争激烈的当今社会,数字化转型、流程化办公等字眼早已充斥在我们的职场生活中。虽然如此,但是我们依然要面临着这样一个现实问题:很多中小企业发展面临着资源有限、技术储备不足、人才短缺的现实问题,进入流程化办公困境依然明…

JSP基础知识

前言:开发需要,有一个老项目,使用的是前后端不分离的框架,前端使用的JSP开发,于是需要恶补JSP的基础知识和语法。以下是学习过程总结的一些有用的基础知识。 推荐学习: JSP 语法 | 菜鸟教程 简介 Jsp是一…

Mybatis总结(持续补充),kafka和mq的区别面试

配置环境:需要引入Mybatis的一个jar包 然后写一个mybatis-config.xml的配置文件里面写着mybatis的核心配置文件,例如:连接的哪个数据库,资源文件的注册(Mapper.xml等) 书写一个MybatsiUtils工具类封装一个…

Monoxer Programming Contest 2024(AtCoder Beginner Contest 345)(A,B,C,D,E,F)

比赛链接 这场。。。好像已经是一周之前的比赛来着,终于补完了。 C是个披着字符串外衣的数学容斥题。D是个超级超级暴力的爆搜,写起来超级麻烦,感觉。。。真是一次酣畅淋漓的赤石。E是个DP,朴素想法其实比较直观,不过…

自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】

大家好,我是淘小白~ 首先,感谢大家的支持~~ ChatGPT采集洗稿软件V5.9版本更新,此次版本更新修改增加了一些内容: 1、自定义多条指令,软件自动判断指令条数,进行输入 2、增加谷歌浏览多账号轮询&#xf…

了解Kafka位移自动提交的秘密:避免常见陷阱的方法

欢迎来到我的博客,代码的世界里,每一行都是一个故事 了解Kafka位移自动提交的秘密:避免常见陷阱的方法 前言位移自动提交简介自动提交的优缺点自动提交位移的优点:自动提交位移的缺点:自动提交与手动提交的对比分析&am…

vuex - 21年的笔记 - 后续更新

vuex是什么 Vuex是实现组件全局状态(数据)管理的一种机制,方便的实现组件之间的数据的共享 使用vuex统一管理状态的好处 能够在vuex中集中管理共享的数据,易于开发和后期维护能够高效地实现组件之间的数据共享,提高…

如何系统的入门大模型?

GPT图解,从0到1构建大模型。 本书将以生动活泼的笔触,将枯燥的技术细节化作轻松幽默的故事和缤纷多彩的图画,引领读者穿梭于不同技术的时空,见证自然语言处理技术的传承、演进与蜕变。在这场不断攀登技术新峰的奇妙之旅中&#xf…

数据安全运营:难点突破与构建策略全解析

小型企业关注基础安全运营,重点把安全产品“管好”和“用好”。大型企业通过SOC平台(安全运营中心)把所有安全产品串联起来,对大量的日志进行关联分析,发现事件和告警。通过SOAR平台把运营工作中能“自动化”内容进行预…

修改Linux系统时间与网络同步

文章目录 1、安装ntpdate2、修改时区3、设置系统时间与网络时间同步4、将系统时间写入硬件时间 1、安装ntpdate # Red Hat和Cent OS系统 sudo yum install ntpdate # 乌班图 sudo apt-get install ntpdate2、修改时区 1)运行tzselect tzselect2)选择A…

H4012耐压30V降压恒压芯片 30V降12V降5V 支持电流3A

耐压30V降压恒压芯片的工作原理如下: 该芯片内部集成了开关管和同步整流管,通过它们进行电压的转换,将输入的30V电压降至所需的输出电压(如12V或5V)。在工作过程中,该芯片通过PWM(脉冲宽度调制…

一套键盘鼠标控制两台电脑 Mouse Without Borders

有两台电脑,一台笔记本一台台式机,拥有各自拥有鼠标和键盘,但总是需要切换,感觉太麻烦,想找个简单的方式,不需要额外操作就能同时操作这两台电脑。无意间发现了一个微软软件Mouse Without Borders&#xff…

项目起冲突,掌握这个模型的人,赢麻了!

在项目管理中,冲突是项目经理们无法避免的一环。在职场中,大家都是如何解决矛盾冲突的呢? 一、项目起冲突的原因及解决方法 项目管理过程中,冲突的产生,往往源自于多个方面,但无论是出于何种原因的项目冲…

#Linux(连接档概念)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)硬链接(inode,建立硬链接的文件inode号相同) (2)创建硬链接:ln 文件名1 文件名…

项目中如何进行限流(限流的算法、实现方法详解)

❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录 限流的算法漏…

quartz整合前端vue加后端springboot

因工作需求&#xff0c;需要能修改定时的任务&#xff0c;前端vue3&#xff0c;后端是springboot 看看页面效果&#xff1a; 首先maven加上引入 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><versi…

日常 ------------ (一)

使用xdd 生成 firmware.cc 文件 &#xff0c;然后程序根据需要自己解压缩,也可以完成软件升级状态的监控 objcopy 此等神奇也可以&#xff0c;但是威力太大&#xff0c;容易玩崩&#xff0c;没敢尝试

Solo 开发者周刊 (第8期):Claude公司再度上新产品,成交额将超73亿美元

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 好文推荐 Claude是否超过Chatgpt,成为生成…

Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证

昨日&#xff0c;Redis 官方宣布了一项重要变更&#xff1a;他们将修改开源协议&#xff0c;未来所有版本将采用 “源代码可用” 的许可证。 具体来说&#xff0c;Redis 不再使用 BSD 3-Clause 开源协议进行分发。从 Redis 7.4 版本开始&#xff0c;Redis 将采用 SSPLv1 和 RSA…

【C语言】自定义类型:联合体和枚举

1. 联合体 1.1 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫&#xff1a;共用体。 给联合…