redis到底几个线程?

news2024/11/15 19:35:22

通常我们说redis是单线程指的是从接收客户端请求->解析请求->读写->响应客户端这整个过程是由一个线程来完成的。这并不意味着redis在任何场景、任何版本下都只有一个线程

为何用单线程处理数据读写?

内存数据储存已经很快了

在这里插入图片描述

redis相比于mysql等数据库是将数据储存到内存中的,那么即使相比于SSD也有1000倍的差距

因此io在当前并不能成为主要瓶颈

优化的数据结构让它更快

在这里插入图片描述

redis有效利用了底层数据结构来保证数据储存的高效,很多时候读写数据时间复杂度仅仅只有O(1)、O(N)或者O(log(N)),相当的快

单线程减少额外损耗

采用单线程架构

  • 最小化减少因为线程创建销毁产生的cpu消耗
  • 最小化减少线程切换产生的cpu消耗
  • 减少多线程下锁产生的性能损耗
  • 能够使用各种线程不安全的命令,如Lpush

为什么6.0之后引入多线程?

随着硬件能力提升,单线程已经无法匹配网络读写速度了

为此redis采用了多线程来更好地处理网络请求

在这里插入图片描述

主要流程如下

  1. 主线程负责接收建立连接请求,获取socket放入等待队列中
  2. 主线程轮询等待队列socket,并分配给网络io线程
  3. io线程读取socket并解析
  4. 主线程执行redis命令
  5. io线程将执行结果写回socket
  6. 主线程清空等待队列,等待客户端后续的请求

6.0之前真的是单线程吗?

在6.0之前仍然存在以下后台线程

  • close_file: 用于关闭文件描述符对应文件(释放socket等)

    • AOF、RDB产生的临时文件
    • 副本数据同步过程中的临时文件
  • aof_fsync: aof刷盘

    • 文件追加写之后刷
    • 文件重写之后刷
  • lazy_free: 惰性释放空间

    • DEL命令

    • FLUSHALL/FLUSHDB命令

采用这些后台线程是想将关闭文件、AOF刷盘、释放内存这些耗时内存分担出去

这些耗时任务业务上常常会采用消息队列处理,redis也用了类似的架构。主线程将任务丢到任务队列中,然后后台线程不断轮询队列

在上面出现了刷盘这个神奇的词,在Linux上指的其实是fsync命令。

Fsync()将文件描述符fd引用的文件的所有修改的内核数据(即,修改的缓冲区缓存页)传输(“刷新”)到磁盘设备(或其他永久存储设备),以便即使系统崩溃或重新启动,也可以检索所有更改的信息。这包括通过磁盘缓存写入或刷新磁盘缓存(如果存在)。在调用过程中会阻塞,直到设备报告数据写入已经完成。

Ref

  1. https://redis.io/docs/getting-started/faq/
  2. https://levelup.gitconnected.com/4-reasons-why-single-threaded-redis-is-so-fast-414e0106f921
  3. https://segmentfault.com/a/1190000040376111
  4. https://juejin.cn/post/7102780434739626014
  5. http://antirez.com/news/93
  6. https://man7.org/linux/man-pages/man2/fsync.2.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集合---list接口及实现类

一、list概述 1、list接口概述 List接口继承自Collection接口,是单列集合的一一个重要分支,我们习惯性地会将实现了 List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方 式进行有序存储的,在…

在linux中怎样同时运行三个微服务保证退出时不会终止

前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version&g…

RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”

RISC-V公测平台Web Server地址&#xff1a;http://175.8.161.253:8081 一、前言 Web Server是互联网应用的基础设施&#xff0c;无论是用户访问网站&#xff0c;还是后端服务提供商和开发者构建各种应用程序&#xff0c;Web Server都在其中扮演着至关重要的角色。 显而易见…

甄品焕新 | 链接上下游企业服务协同,改变服务获取方式

文/玉娇龙 本文字数&#xff1a;3500&#xff5c;预计3分钟读完 使用燕千云上下游服务管理&#xff0c;你可以统一管理IT服务供应商、业务经销商、客户等业务伙伴的服务往来&#xff0c;将企业与上下游公司之间的工单服务往来进行统一管理、共享与升级&#xff0c;实现服务共享…

jmeter接口测试、压力测试简单实现

jmeter测试的组件执行顺序&#xff1a; 测试计划—>线程组—>配置元件—>前置处理器—>定时器—>逻辑控制器—>取样器—>后置处理器—>断言—>监听器 组件的作用范围&#xff1a; 同级组件同级组件下的子组件父组件 目前市面上的三类接口 1、基…

netty 809协议

netty 809协议 目录概述需求&#xff1a; 设计思路实现思路分析1.netty 809 协议2.概念代码 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for chan…

ad+硬件每日学习十个知识点(15)23.7.26 (逻辑器件、拉电流和灌电流、OC门和OD门、总线保持)

文章目录 1.逻辑器件介绍2.什么是总线缓冲器&#xff1f;3.逻辑器件按功能分类4.逻辑器件按工艺分类&#xff08;目前主要用CMOS逻辑&#xff09;5.什么是总线保持&#xff1f;6.逻辑电平7.两个逻辑器件互连&#xff0c;需要满足什么要求&#xff1f;8.什么是推挽&#xff0c;什…

关于自签名证书授权后在哪儿看

目录 firefox可以看到 chrome and edge firefox可以看到 chrome and edge 只能从打开的网站左上角进入

读《全球科技通史》总结——历史总在重演,科技永远向前

今天和大家分享一下吴军老师的《全球科技通史》。大部分人谈到历史的时候&#xff0c;关注的是国家的兴衰、王朝的更替&#xff0c;往往忽视了科技的力量。“文津图书奖”得主吴军博士&#xff0c;从科技视角串联历史&#xff0c;首次以能量和信息两条主线&#xff0c;系统阐述…

【Docker】Docker相关基础命令

目录 一、Docker服务相关命令 1、启动docker服务 2、停止docker服务 3、重启docker服务 4、查看docker服务状态 5、开机自启动docker服务 二、Images镜像相关命令 1、查看镜像 2、拉取镜像 3、搜索镜像 4、删除镜像 三、Container容器相关命令 1、创建容器 2、查…

ad+硬件每日学习十个知识点(9)23.7.20

文章目录 1.正点原子fpga开拓者无gui检查项目2.排针连接器A2541WR-XP-2P3.肖特基二极管反接在LDO的输出端&#xff0c;是什么用&#xff1f;4.在AD中如何实现批量元器件的移动&#xff1f;5.在PCB中&#xff0c;如何让元器件以任意角度旋转&#xff1f;6.接口设计都要做静电防护…

MIT学生揭示ChatGPT完成本科课程存在问题

一个机器学习工程师发推特说&#xff1a;“这太疯狂了&#xff01;”一家专注于人工智能新闻的账号称这是一项“开创性的研究”。这项研究声称&#xff0c;ChatGPT能够以100%的准确率完成麻省理工学院的数学、计算机科学和电气工程本科课程。 它每个问题都答对了。 然而&#…

Spring:泛型依赖注入

Spring 泛型依赖注入问题解决 泛型依赖注入 泛型&#xff1a;具有占位符&#xff08;类型参数&#xff09;的类、结构、接口和方法&#xff0c;通过 <> 的方式定义了一个形式参数&#xff0c;在实例化时再指明具体类型 依赖注入&#xff1a;IoC 的具体实现&#xff0c;…

提升性能的利器:理解线程池的使用、工作原理和优势

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览2.1 为什么创建和销毁线程开销较大2.2 为什么要使…

【C++从0到王者】第十三站:vector源码分析及手把手教你如何写一个简单的vector

文章目录 一、vector的源码分析1.分析思路2.构造函数和插入接口 二、手把手教你写一个简单的vector1.基本结构2.迭代器与私有成员变量的定义3.构造函数4.size和capacity5.迭代器函数接口6.析构函数7.reserve接口8.尾插9.operator[]运算符重载10.简单的测试前面的接口11.insert以…

【Spring框架】Spring读取与存储综合练习

练习 在 Spring 项⽬中&#xff0c;通过 main ⽅法获取到 Controller 类&#xff0c;调⽤ Controller ⾥⾯通过注⼊的⽅式调⽤ Service 类&#xff0c;Service 再通过注⼊的⽅式获取到 Repository 类&#xff0c;Repository 类⾥⾯有⼀个⽅法构建⼀个 User 对象&#xff0c;返…

力扣 7月27日每日一题 2500. 删除每行中的最大值

题目连接 》2500. 删除每行中的最大值 有一句话这么说的&#xff1a;不用把人生的每一个目标都定在年龄线上&#xff0c;人生的本质是体验&#xff0c;感悟&#xff0c;和成长。什么年龄该干什么事本来就是一个伪命题。事实上&#xff0c;当你找到你热爱的东西&#xff0c;你…

C++之std::function总结(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【Docker】初识Docker以及Docker安装与阿里云镜像配置

目录 一、初识Docker 二、安装Docker 三、Docker架构 四、配置Docker镜像加速器 一、初识Docker Docker是一个开源的应用容器引擎&#xff0c;诞生于2013年&#xff0c;基于Go语言实现&#xff0c;dotCloud公司出品&#xff0c;Docker开源让开发者打包他们的应用以及依赖包到…