Redis单线程为什么这么快?

news2024/9/22 21:54:25

Redis单线程为什么这么快?

第一章 Redis单线程为什么这么快


Redis深度剖析【第一章】

  • Redis单线程为什么这么快?
  • 前言
  • 一、Redis为什么要使用单线程,而不是多线程?
    • 单线程的优势
      • 如果Redis使用多线程:
      • 既然多线程切换存在消耗那么为什么JAVA和C#等编程语言又要使用多线程呢?
  • 二、Redis快的原因
    • Redis内部构造
      • 1、网络事件处理器
      • 2、文件处理器
  • 三、Redis处理请求的流程
  • 四、单线程快的原因


前言

在使用数据库是我们往往会使用reids来作为数据库前面的一道防护,由于reids的吞吐量更大所以一般都会用来作为缓存快速的响应,想必大家都或多或少听说过,或者使用过reids,如果你现在还只是知其然而不知其所以然,那么本篇文章将会给您带来帮助,让您看清reids内部的执行过程,让您知道它为什么是单线程却能那么快。


一、Redis为什么要使用单线程,而不是多线程?

单线程的优势

如果Redis使用多线程:

如下图,此时我们只有一个CPU有三个请求需要响应每个请求都需要处理两毫秒;CPU有自己的时间调度方法,可能它只分了1毫秒给线程1那么线程1接收到到这个请求后只处理了1毫秒还没处理完CPU就可能发生了切换切换到了线程3,而此时这个切换也会存在一个代价,因为线程1还没有处理完就直接切换到了线程3存在一个栈帧的一个切换,所以说CPU的切换时存在一定消耗的。

在这里插入图片描述

既然多线程切换存在消耗那么为什么JAVA和C#等编程语言又要使用多线程呢?

因为在JAVA和C#中线程的处理时间通常都会比较长,JAVA和C#往往会进行一些IO操作,或者是跟下游系统的一些交互,或者是操作一些文件,此时IO本身都会被阻塞,此时线程占用着CPU资源其实是没有什么实际用处的还不如切换出去,让其他的线程。此时的CPU切换其实本身效率还是比较高的。但是在Redis中它通常都不会操作IO,而是操作内存不需要阻塞等待如果发生CPU切换的话反而会降低性能

二、Redis快的原因

Redis内部构造

Redis是基于Reactor模式开发的网络事件处理器、文件事件处理器(file event handler)。文件事件处理器它是单线程的,所以我们才称Redis是单线程的模型。但是此时要注意我们所说的Redis是单线程模型并非指的是它只有一个线程,Redis它不是只有一个线程它后台也有很多后台线程。之所以说它是单线程的是因为它里面的网络事件处理器是单线程的。

1、网络事件处理器

网络事件处理器它采用了IO多路服用的一个机制,也就是说我们一个线程同时监听多个socket,根据Socket上的事件类型来选择对应事件处理器来处理这个事件。可以实现高性能的网络通信模型,有可以根据内部其他单线程的模块进行对接,保证了Redis内部线程模型的简单性
如下图:
Redis的socket监听到了来自socke1的信息会创建一个socket去处理他,如果此时socke2也发来信息,线程又会切换去socket2.
此时长得帅的小伙伴就要问了为什么能做到快速处理呢?
因为这些socket他们不是同时到来的。
那要是他们是同时来呢?
因为是单线程先来的socket会先处理只有等先来的socket处理完了才会处理后续到来的socket。
在这里插入图片描述

2、文件处理器

文件处理器的结构包括4个部分:多socket、IO多路复用程序、文件事件分派器、事件处理器(例如:命令请求处理器、命令回复处理器、链接应答处理器等)
多个socket可能并发的产生不同的事件,IO多路复用程序会监听多个socket,会将socket放入一个队列中排队,每次从队列中有序的、同步取出一个socket给事件分派器、事件分派器把socket给对应的事件处理器。然后一个socket的事件处理完之后,IO多路服用程序才会将队列中的下一个socket给事件分派器。文件事件分派器会根据每一个socket当前产生的事件,来选择对应的事件处理器进行处理。

三、Redis处理请求的流程

AE_READABLET:读事件 | AE_WRITABLE:写事件

1、Redis,启动初始化时,将连接应答处理器跟AE_READABLET事件关联。

2、若一个客户端发起连接,会产生一个AE_READABLE事件,然后由连接应答处理器负责和客户端建立连接,创
建客户端对应的socket,同时将这个socket的AE_READABLE事件和命令请求处理器关联,使得客户端可以向主服
务器发送命令请求。

3、当客户端向Redis发请求时(不管读还是写请求),客户端socket都会产生一个AE_READABLE事件,触发命令
请求处理器。处理器读取客户端的命令内容,然后传给相关程序执行。

4、当Redis服务器准备好给客户端的响应数据后,会将socket的AE_WRITABLE事件和命令回复处理器关联,当客
户端准备好读取响应数据时,会在socketi产生一个AE_WRITABLE事件,由对应命令回复处理器处理,即将准备好
的响应数据写入socket,供客户端读取。

5、命令回复处理器全部写完到socket后,就会删除该socket的AE_VRITABLE事件和命令回复处理器的映射。


四、单线程快的原因

  1. 纯内存操作、不需要操作IO
  2. 核心是基于非阻塞IO多路复用机制
  3. 单线程反而避免了多线程的频繁上下文切换带来的性能问题

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

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

相关文章

【博学谷学习记录】大数据课程-学习第一周总结

Linux服务器 对于Linux操作系统来说,其本身是一个整体,包括Linux内核、系统库和系统程序,Linux内核是其最基础的部分,它实现了对硬件资源的管理,并且提供了使用这些硬件资源的通用接口。 自1991年发布Linux内核来&…

项目实战之旅游网(十四)项目部署-Docker

为了节约资源,在生产环境中我们更多的是使用Docker容器部署SpringBoot应用, 我们要用maven里的docker插件来生成镜像并且远程连接Docker, 开启远程docker服务: # 修改docker配置文件 vim /lib/systemd/system/docker.service 把…

简阅人体姿态估计深度学习方法-simpread-Human Pose Estimation Deep Learning Approach

What is Human Pose Estimation? Human Pose Estimation (HPE) is a way of identifying and classifying the joints in the human body Human Pose Estimation(HPR 人体姿态估计)是一个对人体关节进行识别和分类的方法。 Essentially it is a way to capture a set of co…

Good Bye 2022: 2023 is NEAR C. Koxia and Number Theory

原题链接:Problem - C - Codeforces 题意: 给定一个长度为n的数组,请问是否存在一个数 x ,使得任意两个数 与满足 。若是输出 YES ,反之输出 NO 。 思路: 我们可以发现一个规律: 规律&#…

本周大新闻|沙特PIF再投Magic Leap,周融资超5.1亿美元

本周大新闻,AR方面,OVER推出众包AR地图Map2Earn;AR房产平台homeAR推扫码看房功能;苹果智能指环专利公布,支持手势和触觉反馈。 VR方面,奇遇MIX正式发布;AjnaLens将发布新XR头显;Gen…

Cartesi 2022 年 12 月回顾

查看你不想错过的更新2022 年 12 月 31 日 ,我们将继续保持高昂的建设斗志一直持续到2023年。我们在2022年年底前参加了两次编程马拉松, 并不是一次。我们将 Cartesi 的技术带给了ETH India 活动的2000 多名建设者,我们还与 SuperwomenDAO 合…

RabbitMQ消息确认

目录 1. 消息确认作用 2 开发示例 2.1 生产者确认 2.2 消费者确认 1. 消息确认作用 保证消息的可靠性主要依靠三种机制:一个是消息的持久化,一个是事务机制,一个就是消息的确认机制。 1)消息持久化 消息持久化是将消息写入…

卷径计算详解(卷径通过卷绕的膜长和膜厚进行计算)

有关卷绕+张力控制可以参看专栏的系列文章,文章链接如下: 变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环算法,可以查看专栏的其它文章,链接地址如下:PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博客。https://blo…

双向链表的双向冒泡排序、红白蓝砾石排序、算法设计4-5

(PS:直接拿的友友zy的) 一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion:2023.1.1 Last edited: 2023.1.1 目录 (PS:直接拿的友友zy的…

添加USB wifi驱动到RK3568

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、USB接口的wifi芯片二、使用步骤wireless tools 移植wireless tools 工具测试wpa_supplicant 移植openssl 移植libnl 库移植WIFI 联网测试总结前言 在日常开…

CTF-Web渗透(入门|笔记|工具)

php各种漏洞绕过 传送门:https://cloud.tencent.com/developer/article/2127498 php伪协议 详细博客讲解: https://blog.csdn.net/cosmoslin/article/details/120695429 http://hummer.vin/2022/05/10/PHP%E4%BC%AA%E5%8D%8F%E8%AE%AE/ https://ww…

Codeforces Round #833 (Div. 2)

题目链接 A. The Ultimate Square 题意: 给你一个n,表示有n块砖,第i块砖是1*(i/2),这里是上取整,问你最大能组合成的正方形的边长是多少 思路: 观察样例就会发现是n/2上取整,下面看代码&…

快速了解网络原理

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 局域网和广域网 局域网 局域网组建的方式 广域网 网络通信基础 IP地址 端口号 协议 什么是协议 协议分层 分层模型 OSI七层模型 TCP/IP…

Python解题 - CSDN周赛第18期 - 又见背包

卧床一周,一觉醒来,恍如隔世,做什么事都提不起兴趣,也不知道这算不算后遗症。 本期的题目还是比较简单的,也有几道做过的题。最后一道照搬过来的背包题也是比较经典的01背包了,整体感觉没有什么值得说的&am…

linux常用命令(四)- 文件备份解压缩

查看压缩文件信息 - zipinfo zipinfo命令用于列出压缩文件信息。 语法 zipinfo [-12hsvz][压缩文件]-1 只列出文件名称。-2 此参数的效果和指定"-1"参数类似,但可搭配"-h",“-t"和”-z"参数使用。-h 只列出压缩文件的文件名称。-s…

c++11 标准模板(STL)(std::deque)(四)

定义于头文件 <deque> std::deque 元素访问 访问指定的元素&#xff0c;同时进行越界检查 std::deque<T,Allocator>::at reference at( size_type pos ); const_reference at( size_type pos ) const; 返回位于指定位置 pos 的元素的引用&#xff0c;有边…

如何在PVE(Proxmox)中安装OpenWrt软路由?

出处&#xff1a; https://www.928wang.cn/archives/1763.html https://blog.itwk.cc/post/pve_install_openwrt.html 工具准备 WinSCP或者XFTPOpenWrt镜像(自行寻找)安装好PVE的主机一台 安装教程 镜像上传 将下载好的OpenWrt img镜像上传到 PVE主机中(这里使用XFTP工具) 选…

MySQL中的DDL、DML、DCL、DQL

SQL分类 DDL(Data Definition Language)数据定义语言 用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create, drop,alter 等 DML(Data Manipulation Language)数据操作语言 用来对数据库中表的数据进行增删改。关键字&#xff1a;i…

vue-element-表格 Excel 【导入】功能 (2023元旦快乐~~~)

一、页面表格导入功能 我们借鉴vue-element-admin文件来学习表格导入功能,如果你有vue-element-admin的完整文件&#xff0c;可以去这里找 or 用我这里的代码 1. 整体复制到你要用到的页面 <template><div class"app-container"><upload-excel-com…

unreal engine 纹理动态运动的实现

先用ps涉及一张图,发光的地方为白色 下图实际上边缘是相连的白色 split_line.jpgue新建材质 基础色vector3 随便选择一个偏灰的颜色 自发光 TextureCoordirate ->Panner->图片rgb->*发光常量 * 20自发光 预览效果 通过修改纹理协调器的V垂直平铺控制条纹数量 image.pn…