redis是单线程的,那么他是怎么样避免阻塞的

news2024/11/25 12:47:13

Redis 实例有哪些阻塞点?

Redis 实例在运行时,要和许多对象进行交互,这些不同的交互就会涉及不同的操作,下
面我们来看看和 Redis 实例交互的对象,以及交互时会发生的操作。

客户端:网络 IO,键值对增删改查操作,数据库操作;
磁盘:生成 RDB 快照,记录 AOF 日志,AOF 日志重写;
主从节点:主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数据库、加载 RDB
文件;
切片集群实例:向其他实例传输哈希槽信息,数据迁移。

1. 和客户端交互时的阻塞点

网络 IO 有时候会比较慢,但是 Redis 使用了 IO 多路复用机制,避免了主线程一直处在等
待网络连接或请求到来的状态,所以,网络 IO 不是导致 Redis 阻塞的因素

键值对的增删改查操作是 Redis 和客户端交互的主要部分,也是 Redis 主线程执行的主要
任务。所以,复杂度高的增删改查操作肯定会阻塞 Redis。

Redis 中涉及集合的操作复杂度通常为 O(N)

例如集合元素全量查询操作 HGETALL、SMEMBERS,以及集合的聚合统计操作,例如求交、并和差集。这些操作可以作为 Redis 的第一个阻塞点:集合全量查询和聚合操作

集合自身的删除操作同样也有潜在的阻塞风险。你可能会认为,删除操作很简
单,直接把数据删除就好了,为什么还会阻塞主线程呢?

删除操作的本质是要释放键值对占用的内存空间。

应用程序释放内存时,操作系统会将释放的这块内存插入一个空闲内存块的链表,以便后续进行管理和再分配。而大量释放就会就会增加开销,然后阻塞这个地方

当删除了一个bigkey(也就是包含有大量元素的的时候)会有这种问题

bigkey 删除操作就是 Redis 的第二个阻塞点。

由此引出的第三个阻塞点清空数据库。

2. 和磁盘交互时的阻塞点

磁盘 IO 一般都是比较费时费。

然后呢redis 就有了这个aof 和这个 rdb 持久化机制。这两个持久化机制里面呢,就会引出第四个阻塞点AOF 日志同步写(一般说的时always)

3. 主从节点交互时的阻塞点

在主从集群中,主库需要生成 RDB 文件,并传输给从库。主库在复制的过程中,创建和传
输 RDB 文件都是由子进程来完成的,不会阻塞主线程。但是,对于从库来说,它在接收了
RDB 文件后,需要使用 FLUSHDB 命令清空当前数据库,这就正好撞上了刚才我们分析的
第三个阻塞点

从库在清空当前数据库后,还需要把 RDB 文件加载到内存,这个过程的快慢和
RDB 文件的大小密切相关,RDB 文件越大,加载过程越慢,所以,加载 RDB 文件就成为
了 Redis 的第五个阻塞点。

4. 切片集群实例交互时的阻塞点

这个点我只了解了一点,不要有bigkey

总结以上的堵塞点

集合全量查询和聚合操作;
bigkey 删除;
清空数据库;
AOF 日志同步写;
从库加载 RDB 文件

为了避免阻塞式操作,Redis 提供了异步线程机制。所谓的异步线程机制,就是指,Redis 会启动一些子线程,然后把一些任务交给这些子线程,让它们在后台完成,而不再由主线程来执行这
些任务。使用异步线程机制执行操作,可以避免阻塞主线程。

哪些阻塞点可以异步执行?

能被异步子线程执行的都不是关键路径上的操作

关键路径上的操作简单来说客户端把请求发送给 Redis 后,等着 Redis
返回数据结果的操作。

对于 Redis 来说,读操作是典型的关键路径操作,因为客户端发送了读操作之后,就会等
待读取的数据返回,以便进行后续的数据处理。

Redis 的第一个阻塞点“集合全量查询和聚合操作”都涉及到了读操作,所以,它们是不能进行异步操作

删除操作并不需要给客户端返回具体的数据结果,所以不算是关
键路径操作。而我们刚才总结的第二个阻塞点“bigkey 删除”,和第三个阻塞点“清空数
据库”,都是对数据做删除,并不在关键路径上。因此,我们可以使用后台子线程来异步
执行删除操作。

第四个阻塞点aof也不是,他不需要给用户返回结果

所以他也是异步的

第五个 从库加载 RDB 文件”这个阻塞点。从库要想对客户端提供数据存取
服务,就必须把 RDB 文件加载完成。所以,这个操作也属于关键路径上的操作,我们必须
让从库的主线程来执行。

不能用异步解决的就是集合全量查询和聚合操作”和“从库加载 RDB 文
件”。

那么异步又是怎么实现的呢

Redis 主线程启动后,会使用操作系统提供的 pthread_create 函数创建 3 个子线程,分别
由它们负责 AOF 日志写操作、键值对删除以及文件关闭的异步执行。

主线程通过一个链表形式的任务队列和子线程进行交互。当收到键值对删除和清空数据库
的操作时,主线程会把这个操作封装成一个任务,放入到任务队列中,然后给客户端返回
一个完成信息,表明删除已经完成。


但实际上,这个时候删除还没有执行,等到后台子线程从任务队列中读取任务后,才开始
实际删除键值对,并释放相应的内存空间。因此,我们把这种异步删除也称为惰性删除
(lazy free)。此时,删除或清空操作不会阻塞主线程,这就避免了对主线程的性能影
响。

和惰性删除类似,当 AOF 日志配置成 everysec 选项后,主线程会把 AOF 写日志操作封
装成一个任务,也放到任务队列中。后台子线程读取任务后,开始自行写入 AOF 日志,这
样主线程就不用一直等待 AOF 日志写完了

 

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

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

相关文章

springboot scheduling实现定时任务

文章目录 springboot实现定时任务开启springboot定时任务原因分析: 配置线程池,让定时任务指定并发执行先要线程异步执行springboot异步线程池设置指定线程池执行任务 springboot实现定时任务 开启springboot定时任务 springboot实现定时任务很简单&am…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等

流支付正在成为一种全新的支付形态,Zebec Protocol 作为流支付的主要推崇者,正在积极的推动该支付方案向更广泛的应用场景拓展。目前,Zebec Protocol 成功的将流支付应用在薪酬支付领域,并通过收购 WageLink 将其纳入旗下&#xf…

学习才是测试猿的永动力!超详细的 pytest 钩子函数 之初始钩子和引导钩子来啦

前 言 前几篇文章介绍了 pytest 点的基本使用,学完前面几篇的内容基本上就可以满足工作中编写用例和进行自动化测试的需求。从这篇文章开始会陆续给大家介绍 pytest 中的钩子函数,插件开发等等。仔细去看过 pytest 文档的小伙伴,应该都有发现…

内容创作创新技术-147seo采集工具

对于企业和个人来说,内容创作是推广和营销的重要手段。然而,手动撰写大量原创内容不仅费时费力,也有可能陷入创作的瓶颈。面对这一挑战,147采集图文自动改写原创发布应运而生。 147采集图文自动改写原创发布是一款专业、高效的工具…

js-5:==和===的区别,分别在什么情况下使用

1、等于操作符 等于操作符用两个等号()表示,如果操作数相等,则返回true。 javascript中存在隐式转换,等于操作符在比较中会先进行类型转换,再确定操作数是否相等。 遵循以下规则: 如果任一操作数…

武汉多域名https证书能保护几个域名

https证书中可以用一张https证书保护多个域名网站的不止一个,泛域名https证书和多域名https证书都是可以用一张https证书保护多个域名站点,但是两种https证书保护的域名站点类型不同,上一篇我们了解了泛域名https证书,今天就随SSL…

【基于openharmony的多路摄像头功能:USB设备插拔检测】

前言 最近项目接触的模块比较繁多而杂,因此开始写文章记录下用以总结。 目前在做的是基于openharmony3.2的多camera功能主要涉及HDF(HAL)层与framework层。 本文章涉及多路摄像头功能的第一步:支持USB摄像头插拔检测。 内容 目前openharmony在HDF层…

399. 除法求值

题目描述&#xff1a; 主要思路&#xff1a; 本题主要利用并查集的思想&#xff0c;重点是要弄明白分子和分母的指向关系以及一系列的值的变化规则。 查询时如果两个数字不在一个集合里那么结果就为-1. class Solution { public:unordered_map<string,string> f;unorde…

港联证券|早盘三大指数涨跌不一 医药商业板块涨近3%

周二&#xff08;8月8日&#xff09;&#xff0c;三大指数涨跌纷歧&#xff0c;到上午收盘&#xff0c;上证指数涨0.01%&#xff0c;报3269.29点&#xff1b;深证成指和创业板指别离跌0.06%和0.05%&#xff1b;沪深两市合计成交额5062.22亿元&#xff0c;总体来看&#xff0c;两…

通信行业实操技巧,让你的基站无人能及!

当今社会&#xff0c;通信网络已经成为人们生活和工作中不可或缺的一部分&#xff0c;而电信基站作为这一网络的支撑和枢纽&#xff0c;扮演着至关重要的角色。 因此&#xff0c;精密空调监控在现代通信基站的运维中具有重要意义&#xff0c;为通信技术的发展和进步提供了有力支…

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具&#xff0c;流行了很多年&#xff0c;知道现在依然是大部分Java项目的构建工具的首选&#xff1b;但随着项目复杂度提高&#xff0c;代码量及依赖库的增多使得ma…

Vue电商项目--服务器

购买服务器 就是如果想要别人访问我们的项目&#xff0c;那么我们就需要服务器。 我们之前使用node搭建服务器&#xff0c;只能在局域网中访问。 购买云服务器的方式有很多&#xff1a;像阿里云&#xff0c;腾讯云等等 腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 安全…

机器学习鱼书笔记(自用更新)

零、预知识 1.Numpy 使用 介绍&#xff1a;高效的操作多维数组的函数库。 安装&#xff1a;&#xff08;前提已经安装了python&#xff09; pip install numpy导入 import numpy as np创建数组 Numpy最重要的数据结构是多维数组&#xff08;ndarray&#xff09;。通过Numpy&…

关于C++静态代码扫描工具及基于jenkins流水线搭建vs报告分析工具开发的小总结

静态代码扫描&#xff09; 主要内容&#xff1a;Tscancode 报告解析插件使用1.Tscancode linux使用命令介绍2.插件jar包3.tscancode扫描生成的文件4.解析报告插件执行方式与参数说明5.解析后生成报告样式 CPPCHECK报告解析1.cppcheck 代码扫描linux命令2.解析报告插件使用 报告…

ArduPilot开源飞控之Companion Computers简单分析

ArduPilot开源飞控之Companion Computers简单分析 1. 源由2. 伴机系统2.1 APSync2.2 DroneKit2.3 FlytOS2.4 Maverick2.5 ROS2.6 Rpanion-server 3. 总结4. 参考资料 1. 源由 从稳定性&#xff0c;社区群体&#xff0c;以及开源方式的角度看&#xff0c;Ardupilot是不错的选择…

【Vue】使用print.js插件实现打印预览功能,超简单

目录 一、实现效果 二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div&#xff0c;给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码 一、实现效果 二、实现步…

647. 回文子串

目录 一、题目 二、代码 一、题目 二、代码 双指针&#xff01;&#xff01;&#xff01; class Solution { public:bool Palindrome(string s,int i,int j){int begini;int end j;while(begin<end){if(s[begin]!s[end]){return false;}begin;end--;}return true;}int …

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成&#xff0c;如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

解决Vue+Element-UI 进行From表单校验时出现了英文提示问题

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 问题描述 在使用form表单时&#xff0c;往往会对表单字段进行校验&#xff0c;字段为必填项时会添加required属性&#xff0c;此时自定义rules规则…

vue中全局状态存储 pinia和vuex对比 pinia比vuex更香 Pinia数据持久化及数据加密

前言 毕竟尤大佬都推荐使用pinia&#xff0c;支持vue2和vue3&#xff01; 如果熟悉vuex&#xff0c;花个把小时把pinia看一下&#xff0c;就不想用vuex了 支持选项式api和组合式api写法pinia没有mutations&#xff0c;只有&#xff1a;state、getters、actionspinia分模块不…