redis高级篇一

news2024/12/23 15:27:51

redis 是多线程还是单线程

redis单线程的操作

主要是指redis的网路IO和键值对的读写是由一个线程来完成的,Redis在处理客户端的请求时,包括获取(socket 读),解析,执行,内容返回(socket 写)等,这些按顺序串行的命令由一个线程执行,这就是所谓的单线程。这也是redis对外提供键值存储的主要流程。

比如redis-cli -a 11111 --raw 对应 创建socket 解析请求
set k1 v1 对应 执行操作 返回的结果对应 写入socket

在这里插入图片描述

redis 多线程的操作

但是redis其他功能,比如持久化RDB,AOF,异步删除,集群数据同步等等,其实是由额外的线程执行的。

所以redis命令工作线程是单线程的,但是对整个redis来说,是多线程的。

redis 3.0之前或者工资线程为什么要选择单线程

  1. 使用单线程模型使Redis开发维护更简单,因为单线程模型方便开发与调试。
  2. 即使使用单线程模型也可以并发的处理多客户端请求,主要是IO多路复用和非阻塞IO。
  3. redis是基于内存操作,因此他的瓶颈可能是机器的内存或者网络带宽,并非CPU。那么自然而然就采用单线程比较合适。但是在4.0以后支持多线程,例如RDB,AOF,后台删除等。

redis多路复用

背景

比如redis需要删除一个很大的数据使(几十万个k的hash),因为是单线程原子操作,这回导致Redis服务卡顿。于是在redis4.0中就新增了多线程模块,当然此版本是为了解决删除数据效率较低的问题。这就是lazy-free的体现
lazy-free的本质就是把某些耗时较高的操作,从主线程剥离让子线程处理极大的减少了主线程阻塞时间,从而增加稳定性。

抛开内存不谈,影响redis性能那就是网络IO。

redis6/7中,非常受关注的第一个新特性就是多线程。
这是因为,redis被大家熟知的就是他的单线程架构,虽然有些命令操作可用子线程执行(比如数据删除,快照生成,AOF重写)。但是,从网络IO处理到实际的读写命令处理,都是由单个线程完成的。

随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络IO的处理上。也就是说单线程的处理网络请求的速度跟不上底层网络硬件的速度。

为了应对这个问题:
采用多个IO线程来处理网络请求,提高网路请求处理的并行度,Redis6/7采用的就是这种办法。

但是多个IO线程只是用来处理网络请求,对于读写命令Redis仍然使用单线程来处理。
这是因为,redis在处理请求时,网络处理经常是瓶颈,通过多个IO线程并行处理网络请求,可以提升实例的整体处理性能。而继续使用单线程(主线程)处理命令操作。就不用为了保证事物的原子性额外的开发多线程互斥加锁机制。

处理网络请求(主线线与IO线程是如何协作的)

讲到了这里,我们其实接触了两种线程,一种是主线程,一个是IO线程。那这两种线程是如何协作的呢?主要是以下4个步骤。

  1. 客户端与服务端建立socket链接(redis-cli -a 111111)
    主线程负责建立连接,并把socket放入全局等待队列,主线程通过轮询的方法将socket连接分配给IO线程。
  2. IO线程读取并解析请求(读取命令(set k1 k1),解析命令(set k2 v1))
    主线程一旦把socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求,此时采用多个IO线程并行处理。因为有多个IO并行处理,这个过程可以快速完成。
  3. 主线程执行解析后的命令(执行解析后的命令set k1 v1,get k1)
    IO线程解析完请求,主线程还是会以单线程的方式执行这些命令。
  4. IO线程会写回socket和主线程清空全局队列
    当主线程执行完请求命令后,会将结果写入缓冲区,主线程进入阻塞状态,等待IO线程将结果会写socket中,并返回客户端。这一步和IO线程读取和解析一样,也是有多个IO线程并行处理。也可以快速完成。

回写socket 完毕后,主线程清空全局队列

在这里插入图片描述

UNIX 网络编程中的5种IO模型

1.Blocking IO: 阻塞IO
2. NoBlocking IO :非阻塞IO
3. IO multiplexing: IO多路复用
4. signal drive IO:信号驱动
5. async IO :异步IO
Linux中一切皆文件,文件描述符 FD,句柄。FD实际是一个索引值,当程序打开一个文件或创建一个文件时,内核回返回一个文件描述符。

在这里插入图片描述
在这里插入图片描述
每次socket连接 都会产生一个fd,放入全局队列。

什么时IO多路复用呢

一个同步的IO模型,实现一个线程监视多个文件的句柄,一旦某个文件句柄就绪就能够通知对应的应用程序进行相应的读写操作。没有文件句柄就绪时,就会阻塞应用程序,从而释放CPU资源。
比如 get k1 到返回结果之间的过程,就是一个句柄就绪到读操作的过程。

I/O:网络IO,尤其在操作系统层面,是指数据在内核态和用户态之间的读写操作。
多路:多个客户端连接(连接就是套接字描述符,即socket或则channel)
复用:复用一个或多个线程
IO多路复用:也就是说一个或一组线程处理多个TCP连接,使用单线程就能够实现同时处理多个客户端连接,无需创建或维护过多的线程。
在简单一句话描述:一个服务端端进程可以同时处理多个套接字描述符,
实现多路复用的模型有3种。 select和poll以及epoll.

epoll 场景解释

模拟一个TCP服务器处理30个客户客户端 (1个redisserver,30个 redis-cli)
假设一个监考老师,监管30个学生考试,然后负责收卷。有下面几种选择

  1. 逐个验收(select轮询),这时候有一个同学不想交卷,全班都会被耽误,逐个处理不具备并发能力。
  2. 施展分身(poll一对一),创建30个分身(30个线程)
  3. 响应式处理(epoll一对多),站在讲台等,谁要交卷,举个手,老师去收卷。比如C,D举手,老师下去依次收卷。然后上台。上台后,E,F又举手,再去处理E,F.这就是IO多路复用模型。

因此epoll能够高效的处理成千上万的并发连接,而且性能不会随着并发量的升高而下降。

select :对socket是线性扫描,即轮询,效率较低。仅仅知道有IO事件发生,去不知道时那几个socket发生的IO事件。只会无差异的轮询所有的socket连接。找出能读写的sokect连接
。同时socket连接越多,轮询的时间越长。

如果我们不用轮询所有socket连接,而是让活跃的socket连接自己去反馈读写的就绪状态呢,是否可以提升效率呢。这就时epoll出现的原因。

redis 为什么这么快

  1. 基于内存操作:redis的所有数据都存储在内存中,所有的运算都是内存级别的,所以他性能别较高
  2. 数据结构简单:redis的数据结构是专门设计的,这些数据结构的查找和操作的时间复杂度基本都为O(1),因此性能较高
  3. I/O多路复用和非阻塞I/O:redis使用I/O多路复用功能来监听多个socket连接客户端,这样可以使用一个线程来处理多个请求,同时也避免了I/O阻塞操作。
  4. 避免上下文切换:因为单线程模型,因此就避免了不必要的上下文切换和多线程竞争,这就省去了上下文切换的时间

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

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

相关文章

linux(动静态库)

目录: 1.文件时间的概念 2.动态库和静态库 3.如何制作动静态库 -------------------------------------------------------------------------------------------------------------------------------- 1.文件时间的概念 我们现在就开始学习这三个时间分别表示了什…

AI百科:一个开启人工智能时代的综合性平台

无论是人工智能的快速发展还是AI技术在各个领域的广泛应用,都让我们对智能未来充满了期待和好奇。随着科技的进步,发现了一个好网站,一个集合了丰富AI工具和产品介绍的综合性网站—— AI百科。 在人工智能(AI)领域的快…

【实用工具 - vscode】实现Linux服务器的远程操控

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【计算机工具】 ✒️✒️本篇内容:vscode的下载安装,常见插件及详细安装方法,插件停用及卸载,vscode快捷键 …

如何将文件制作成二维码

日常生活和工作中,为了让大家更方便的查阅文件,可将文件生成二维码,打印在通知书、会议要求,或是直接用“二维码”分享。通过草料二维码可以将多种类型的文件快速生成文件二维码,微信扫码查看即可查看和下载文件。 ● …

项目风险管理的四个阶段,你了解多少?

项目风险管理是项目管理的一部分,目的是保证项目总目标的实现。 风险管理包括风险识别、风险估计、风险解决和风险监控。风险管理贯穿在项目中的每个环节,在项目的生命周期中监控风险是非常重要的手段。 风险管理包含四个阶段: 1、风险识别…

从需求分析到功能扩展:打破瓶颈,构建智能采购管理软件

在当今快速发展的商业环境下,采购管理已成为企业发展的关键环节之一。如何在采购管理中快速响应市场需求、协调供应链、提高效率和降低成本,是摆在企业面前的一个巨大挑战。因此,打破瓶颈,构建智能采购管理软件成为了迫切的需求。…

内蒙古自治区住房和城乡建设分析及解决方案

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划(2021—2035年)的通知》(国办发 ﹝2020﹞39号)、《国家发展改革委等部门关于进一步提升…

一文读懂如何将 Rancher 下游集群升级到 Kubernetes v1.25

介 绍 最初在 Kubernetes v1.21 中被弃用的 PodSecurityPolicy API,已经在 Kubernetes v1.25 中被完全删除。由于 API 被移除,你无法在 Kubernetes v1.25 集群中创建、编辑或查询 PodSecurityPolicy 资源。此外,由于其准入控制器已被移除&am…

JAVA-类隔离机制

一、类加载: 1、类加载:Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码加载到内存,发给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的…

Windows 上安装和启动 Nacos 2.2.2 最新版本

文章目录 前言版本声明本地启动1. 下载 Nacos2. 开启鉴权配置3. 持久化数据库4. 启动 Nacos5. 启动测试 联系我 前言 本文旨在为您详细介绍如何安装和启动 Nacos 2.2.2 的最新版本,以及为 youlai-mall 开源商城版本的升级做好准备工作。 版本声明 名称版本操作系…

企业工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重&#xff0c…

【IP技术】IP地址详细解释

大家知道如何查看本机的 IP 吗?这个问题,即便是没有专业学过计算机的人,只要折腾过电脑,重装过系统,大多都会知道答案:在 Windows 下是 ipconfig,在 linux 下是 ifconfig。 在 Windows 下输入 i…

Activity的onCreate方法是怎样被调用的?

Activity的onCreate方法是怎样被调用的? 按前面源码分析的介绍,在Activity的onCreate方法中,添加如下的log: android.util.Log.i("wztest", "Activity onCreate", new Exception());重新编译后,…

移动云COCA架构,重新定义下一代云

当前,算力已经成为 全球科技竞争的焦点 为此,移动云重磅发布 「移动云COCA(Compute on chip Architecture)软硬一体片上计算架构」 以下简称移动云COCA架构 以此打造国家级自主可控的 高性能算力底座 带动国产化智算产业成熟…

10款实用高效的网页版PS插件推荐!

PS是设计界适用范围广、应用次数多的基础性设计工具,PS的功能之强大,常常令新手望而却步。其实,为了对PS的功能进行补充和优化,这些年来陆续开发出了许许多多的功能性PS插件,在网页版 PS ——即时设计上有很多PS插件使…

如何利用AI学习区块链知识,ChatGPT x Kapa.ai ⇒ 开发者的福音

由OpenAI推出的人工智能聊天机器人ChatGPT在各大平台掀起了一阵狂热之风。发布仅四个月的时间,获得超一亿用户,成长速度远高于现今网络应用巨头脸书和Amazon。随着最新版本GPT-4的正式上线,其AI性能和完善程度再度提升,深受用户和…

PMP考试都是什么题?

PMP新版大纲加入了ACP敏捷管理的内容,说是敏捷混合题型占到了 50%,但是这次318的考试,敏捷题占了大半,都说敏捷和情景快要占到80%-90%。 所以有友友说开了四个小时盲盒,题目读不懂,或者觉得4个选项都不对或…

深度学习进阶篇-预训练模型[2]:Transformer-XL、Longformer、GPT原理、模型结构、应用场景、改进技巧等详细讲解

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

xxs跨站之原理分类及攻击手法(25)

xss跨站达到原理&#xff0c;危害和特点 他和语言没有太大关系&#xff0c;它大部分都是属于一个前端的漏洞&#xff0c;搭建一个简易的php网站存在xss跨站漏洞 访问这个网站&#xff0c;x1&#xff0c;就输出1&#xff0c; 如果我们把x<script>alert(1)</script&g…

图解LeetCode——24. 两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 二、示例 2.1> 示例 1&#xff1a; 【输入】head [1,2,3,4] 【…