面试题:Redis(一)

1. redis是单线程还是多线程?

2. IO多路复用听说过么?

3. Redis为什么快?

1. Redis是单线程还是多线程?

版本不同,Redis基于的架构也不同,所以单单问是单还是多线程并不严谨

3.x 之前 redis都是单线程

4.x 开始逐渐引入多线程,负责客户端请求处理时是单线程,但是添加了(异步删除)

6.x 开始确定为多线程

2. 厘清Redis是单线程是何意义? 

Redis单线程

主要是指Redis网络IO和键值对读写都是由一个线程完成,Redis处理客户端请求时主要包括:内容获取(Socker读)、解析、执行、内容返回(Socket写)等都是由主线程单独完成,这就是所谓的”单线程“,这也是Redis对外提供键值对读写服务的主要流程

但Redis的其他功能比如(持久化RDB、AOF、集群数据同步、异步删除)等都是由额外线程完成的

Redis工作命令是单线程,但是对于整个Redis来说是多线程

3. Redis3.x单线程时代性能依旧很快的主要原因?

他的大体意思是说 Redis 是基于内存操作的,因此他的瓶颈可能是机器的内存或者网络带宽而并非 CPU,既然 CPU 不是瓶颈,那么自然就采用单线程的解决方案了,况且使用多线程比较麻烦。但是在 Redis 4.0 中开始支持多线程了,例如后台删除、备份等功能。

 简单来说Redis4.x之前使用单线程主要有以下3个原因:

1. 使用单线程模型使Redis开发和维护更加简单,因为单线程模型方便开发和调试

2. 即使使用单线程模型也可以并发的处理多客户端请求,主要是使用IO多路复用和非阻塞IO

3. Redis的性能瓶颈主要是内存和网络带宽,并非CPU

4. 为什么逐渐加入多线程特性? 

单线程的局限

正常情况下Redis可以很快删除数据,而当删除的数据包含成千上万个hash集合时,del指令会造成线程卡顿

这也是Redis3.x单线程时代的经典故障,大key删除问题

由于redis是单线程的,del  bigKey .....

等待很久这个线程才会释放,类似加了一个synchronized锁,你可以想象高并发下,程序堵成什么样子?

解决方案

使用惰性删除可以有效避免Redis卡顿问题

因此在Redis4.x之后引入多线程实现数据的异步惰性删除等功能,但是处理数据读写功能仍由一个线程完成,所有Redis此时还算是狭义上的单线程

 5. Redis的性能瓶颈

在Redis6/7中,非常受关注的第一个新特性就是多线程。

这是因为,Redis一直被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF重写)。但是,从网络IO处理到实际的读写命令处理,都是由单个线程完成的。

 

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

 

为了应对这个问题:

采用多个IO线程来处理网络请求,提高网络请求处理的并行度,Redis6/7就是采用的这种方法。

 

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

为解决网络io问题redis开启多个网络io线程,当有请求读写操作时主线程会到对应的io线程执行相对应的命令操作

多线程之前

I/O 的读和写本身是堵塞的,比如当 socket 中有数据时,Redis 会通过调用先将数据从内核态空间拷贝到用户态空间,再交给 Redis 调用,而这个拷贝的过程就是阻塞的,当数据量越大时拷贝所需要的时间就越多,而这些操作都是基于单线程完成的。

加入网络io多线程之后

从Redis6开始,就新增了多线程的功能来提高 I/O 的读写性能,他的主要实现思路是将主线程的 IO 读写任务拆分给一组独立的线程去执行,这样就可以使多个 socket 的读写可以并行化了,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),将最耗时的Socket的读取、请求解析、写入单独外包出去,剩下的命令执行仍然由主线程串行执行并和内存的数据交互。

结合上图可知,网络IO操作就变成多线程化了,其他核心部分仍然是线程安全的,是个不错的折中办法。

Redis6→7将网络数据读写、请求协议解析通过多个IO线程的来处理 ,

对于真正的命令执行来说,仍然使用主线程操作

演变总结

Redis自身出道就是优秀,基于内存操作、数据结构简单、多路复用和非阻塞 I/O、避免了不必要的线程上下文切换等特性,在单线程的环境下依然很快;

 

但对于大数据的 key 删除还是卡顿厉害,因此在 Redis 4.0 引入了多线程unlink key/flushall async 等命令,主要用于 Redis 数据的异步删除;

 

而在 Redis6/7中引入了 I/O 多线程的读写,这样就可以更加高效的处理更多的任务了,Redis 只是将 I/O 读写变成了多线程,而命令的执行依旧是由主线程串行执行的,因此在多线程下操作 Redis 不会出现线程安全的问题。

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

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

相关文章

微知-如何临时设置Linux系统时间?(date -s “2024-10-08 22:55:00“, time, hwclock, timedatectl)

背景 在tar解压包的时候经常出现时间不对,可以临时用date命令修改一下,也可以其他,本文主要介绍临时修改的方法 date命令修改 sudo date -s "2024-10-08 22:55:00"其他查看和修改的命令 本文只记录查看方式,修改的暂…

【java数据结构】ArrayList实例

【java数据结构】ArrayList实例 一、杨辉三角二、打扑克 一、杨辉三角 已知条件:给定行数的大小 思路:首先定义一个二维列表(也可以称为集合),我们对每一列处理完,最后把每一列加起来,不就是完整…

某象异形滑块99%准确率方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 该文章模型已经上线ocr识别网站,欢迎测试!!,地址:http://yxlocr.nat300.top/ocr/slider/6 所谓的顶象异形滑块,是指没有采用常规的缺口,使用各种形状的缺口…

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中,有3台服务器的路径不是一样的,那么在这种情况下您就可以使用本功能,单独执行不一样的路径 点击【高级】上传

仿真技术入门书籍:《模拟集成电路设计与仿真》(可下载)

无论是在通信、医疗、消费电子还是工业控制领域,模拟集成电路都是实现复杂电子系统功能的关键。在电子工程领域,模拟集成电路设计是一门深奥而复杂的学科。随着技术的发展,设计者们需要掌握的不仅是电路设计原理,还包括仿真技术的…

【C语言刷力扣】1436.旅行终点站

题目: 解题思路: 两层循环查找,第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination ,若是作为某次旅行的起点,说明不是最后的终点。 char* destCity(char ***paths…

Tomcat服务部署、优化及多实例实验

目录 一、Tomcat的基本介绍 1. tomcat是什么? 2.tomcat构成组件 2.1 web容器 2.2 servlet容器 2.3 jsp容器 3. tomcat的顶层架构 4.tomcat的核心功能 5.tomcat的请求过程 6.tomcat的配置文件 二、tomcat服务部署 1. 安装jdk、设置环境变量并测试 2.安装启动t…

Windows无需管理员权限,命令轻松修改IP和DNS

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL)。 “ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…(每天更新不间断,福利…

【数据分享】1901-2023年我国省市县三级逐月最高气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最高气温栅格数据(可查看之前的文章获悉详情),该数据来源于国家青藏高原科学数据中心,很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我们能不能把数据处理为更方便使用的Sh…

计算机网络:数据链路层详解

目录 一、点对点信道: (1)封装成帧 (2)透明传输 (3)差错检测 二、点对点协议 (1)数据链路层的特点 (2)PPP协议的组成 (3&…

Vue3 使用 pinia

什么是Pinia Pinia是 Vue 的存储库,它允许您跨组件/页面共享状态,与vuex功能一样。 准备 安装 npm install pinia 或者 yarn add pinia使用 首先修改main.ts文件 main.ts import ./assets/main.cssimport { createApp } from vue import App from…

《强烈推荐一个强大的书签管理工具》

在信息爆炸的时代,我们每天都会浏览大量的网页,收藏各种各样的书签。然而,随着书签数量的增加,管理起来也变得越来越困难。这时,一个强大的书签管理工具就显得尤为重要。今天,我要向大家推荐一款备受好评的…

[控制理论]—差分变换法与双线性变换法的基本原理和代码实现

差分变换法与双线性变换法的基本原理和代码实现 1.差分变换法 差分变换法就是把微分方程中的导数用有限差分来近似等效,得到一个与原微分方程逼近的差分方程。 差分变换法包括后向差分与前向差分。 1.1 后向差分法 差分变换如下: d e ( t ) d t e…

下一个赛场见!从中网看海尔智家的全球化布局

下一个赛场见! 我想这是每个看完中国网球公开赛女子决赛后,清晰又坚定的约定。正如国庆假期后,下一个假期见成为很多人的期待。 10月6日,备受瞩目的中国网球公开赛女子决赛迎来了最高光时刻并落下帷幕。 美国选手高芙获得冠军&…

如何高效开展关联方风险监控?

关联方风险监控是指对企业与其关联方之间的交易、资金往来、担保等行为进行监控,以识别和防范潜在的风险。以下是一些高效开展关联方风险监控的方法: 1.建立关联方识别机制: 明确关联方的定义,包括直接或间接控制企业的个人或实体…

一个月学会Java 第5天 控制结构

Day5 控制结构 这么叫可能有些就算有基础的人也看不懂,其实就是if-else、switch-case、for、while、do-while这几个,没基础的听到了这个也不要慌张,这几个是程序的基础,多多训练就好 第一章 顺序结构 这章其实没有什么好讲的&…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

算法:前缀和算法模版

一维前缀和 题目 链接:一维前缀和模版题 思路分析 一:暴力O(q * N) 对于每一次询问,我们都可以用一个循环计算[l,r]区间内的元素和, 时间复杂度,O(q * N) 每一次计算一个区间都需要去循环一次,这是不是…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作: 对于 Tom 创作的任何图像,转换为灰度。 对于任何以红色作为主色的图像,移除绿色和蓝色分量&#xff0…

如何避免PuTTY的连接超时

问题:使用PuTTY默认创建的SSH连接,过一会就会提示“Remote side unexpectedly closed network connection" 解决方法: 要防止PuTTY会话由于空闲而断开连接,可以通过启用keep-alives功能,使PuTTY定期向远程主机发…