Redis内部的阻塞式操作以及应对方法

news2024/11/15 4:07:47

Redis之所以被广泛应用,很重要的一个原因就是它支持高性能访问,也正因为这样,我们必须要重视所有可能影响Redis性能的因素,不仅要知道具体的机制,尽可能避免异常的情况出现,还要提前准备好应对异常的方案。

所以,介绍一下影响Redis性能的5大方面的潜在因素,分别是:

  • Redis内部的阻塞式操作;
  • CPU核和NUMA架构的影响;
  • Redis关键系统配置;
  • Redis内存碎片;
  • Redis缓冲区。

这篇笔记,我们先学习Redis内部的阻塞式操作以及应对的方法。

Redis的网络IO和键值对读写是由主线程完成的。那么,如果在主线程上执行的操作消耗的时间太长,就会引起主线程阻塞,但是,Redis既有服务客户端的请求的键值对增删改查操作,也有保证可靠性的持久化操作,还有进行主从复制时的数据同步操作,等等,这么多操作,究竟哪些会引起阻塞呢?

接下来,我们分门别类地梳理下这些操作,并且找出阻塞式操作。

Redis实例有哪些阻塞点?

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

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

为了帮你理解,我再画一张图来展示这4类交互对象你和具体操作之间的关系。

image

接下来,我们来逐个分析下在这些交互对象中,有哪些操作会引起阻塞。

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

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

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

那么,怎么判断操作复杂度是不是高呢?这里有一个最基本的标准,就是看操作的复杂度是否为O(N)。

Redis中涉及集合的操作复杂度通常为O(N),我们要在使用时重视起来,例如集合元素全量查询操作HGETALL、SMEMBERS,以及集合的聚合统计操作,例如求交、并和差集。这些操作可以作为Redis的第一个阻塞点:集合全量查询和聚合操作

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

其实,删除操作的本质是要释放键值对占用的内存空间,你可不要小瞧内存的释放过程,释放内存只是第一步,为了更加高效地管理内存空间,在应用程序释放内存时,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。这个过程本身需要一定时间,而且会阻塞当前释放内存的应用程序,所以,如果一下子释放了大量内存,空闲内存链表操作时间就会增加,相应地就会造成Redis主线程的阻塞。

那么,什么时候会释放大量内存空间呢?其实就是大量删除键值对数据的时候,最典型的就是删除包含了大量元素的集合,也称为bigkey删除,为了让你对bigkey的删除性能有一个直观的印象,我测试了不同元素数量的集合在进行删除操作时所消耗的时间,如下:
image

从这张表里,我们可以得出三个结论:

  1. 当元素数量从10万增加到100万时,4大集合类型的删除时间的增长幅度从5倍上升到了近20倍;
  2. 集合元素越大,删除所花费的时间就越长;
  3. 当删除有100万个元素的集合时,最大的删除时间绝对值已经达到了1.98s。Redis的响应时间一般在微秒级别,所以,一个操作达到了近2秒,不可避免地会阻塞主线程。

经过刚刚的分析,很显然,bigkey删除操作就是Redis的第二个阻塞点。删除操作对Redis实例性能的负面影响很大,而且在实际业务开发时很容易被忽略,所以一定要重视它。

既然频繁删除键值对都是潜在的阻塞点了,那么,在Redis的数据库级别操作中,清空数据库,必然也是一个潜在的阻塞风险点,因为它涉及删除和释放所有的键值对,所以,这就是Redis的第三个阻塞点,清空数据库

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

我之所以把Redis与磁盘的交互单独列为一类,主要是因为磁盘IO一般都是比较费时费力的,需要重点关注。

幸运的是,Redis开发者早已认识到磁盘IO会带来阻塞,所以把Redis进一步设计为采用子进程的方式生成RDB快照文件,以及执行AOF日志重写操作,这样一来,这两个操作由子进程负责执行,慢速的磁盘IO就不会阻塞主线程了。

但是,Redis直接记录AOF日志时,会根据不同的写回策略对数据做落盘保存,一个同步写磁盘的操作的耗时大约是1~2ms,如果有大量的写操作需要记录在AOF日志中,并同步写回的话,就会阻塞主线程了,这就得到了Redis的第四个阻塞点了:AOF日志同步写

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

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

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

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

最后,当我们部署Redis切片集群时,每个Redis实例上分配的哈希槽信息需要在不同实例间进行传递,同时,当需要进行负载均衡或者有实例增删时,数据会在不同的实例间进行迁移,不过,哈希槽的信息量不大,而数据迁移是渐进式执行的,所以,一般来说,这两类操作对Redis主线程的阻塞风险不大。

不过,当你使用了Redis Cluster方案,而且同时正好迁移的是bigkey的话,就会造成主线程的阻塞,因为Redis Cluster使用了同步迁移。

学习来源:极客时间 《Redis核心技术与实战》学习笔记 Day08

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

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

相关文章

MySQL进阶篇之索引2

02、索引 前四节内容:https://blog.csdn.net/kuaixiao0217/article/details/128753999 2.5、SQL性能分析 2.5.1、查看执行频次 1、SQL执行频率 MySQL客户端连接成功后,通过show [session|global] status命令可以提供服务器状态信息。 通过如下指令…

Computer architecture Cyber security Quantum computing交友

如果您也是computer architecture方向的博士硕士,希望交个朋友,欢迎后台私信。 当然,如果您也是 Cyber SecurityQuantum ComputingHigh Performance Computing 方向的博士硕士,想要交流,也可以私信。

学习记录669@项目管理之项目合同管理

有效合同原则 有效合同应具备以下特点: (1)签订合同的当事人应当具有相应的民事权利能力和民事行为能力。 (2)意思表示真实。 (3)不违反法律或社会公共利益 与有效合同相对应,需要避免无效合同。无效合同通常需具备下列任一情形: (1)一方以欺诈、胁迫的手段订立合…

【模拟CMOS集成电路】电路失调与CMRR—— 随机失调与系统失调分析(1)

电路失调与CMRR—— 随机失调与系统失调分析(1)前言1.1失调1.2失调电路模型1.2.1随机失调电路模型(1)电阻失配(2)跨导失配(3)电流镜的随机失调1.2.2系统失调前言 本文主要内容是失调…

深入剖析JVM垃圾收集器

文章目录前言1、新生代垃圾收集器1.1、Serial1.2、ParNew1.3、Parallel Scavenge2、老年代垃圾收集器2.1、Serial Old2.2、Parallel Old2.3、CMS(Concurrent Mark Sweep)3、全堆垃圾收集器3.1、Garbage First(G1)前言 参考资料&am…

ConfigurationProperties将配置绑定到bean的过程分析

概述 ConfigurationProperties是一个大家常用的注解。有一些系统配置,经常放在yml中,然后通过spring注入到bean中。 一般这些配置都是通过在spring生命周期的某一个环节,将属性注入进去的。 ConfigurationProperties就是利用了org.springf…

AC500 基于 Profinet 通讯连接变频器

硬件连接 使用 PM583-ETH 作为 Profinet 通讯的主站,ACS800 变频器 RETA-02 作为 Profinet 通讯的从站 2 ABB 变频器设置 以安装有 RETA-02 总线适配器的 ACS800 变频器为例,参照下表进行参数设定。详 细内容请参考变频器手册和 RETA-02 用户手册。表中…

Python 超强命令行解析工具 argparse !

在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse, getopt, argparse。这里面功能最强大的莫过于 argparse,下面就来看看它用法。import argparse# 使用 argpa…

计算机视觉OpenCv学习系列:第七部分、图像操作-3

第七部分、图像操作-3第一节、图像统计信息1.像素值统计2.函数支持说明3.代码练习与测试第二节、图像直方图1.图像直方图定义2.直方图函数3.代码练习与测试第三节、图像直方图均衡化1.直方图均衡化2.直方图均衡化函数3.代码练习与测试学习参考第一节、图像统计信息 1.像素值统…

零基础学JavaWeb开发(二十一)之 spring框架(4)

3、AOP详解 3.1、Aop常用术语 1.连接点(Join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。类中的哪些方法可以被增强,这些…

详解动态规划01背包问题--JavaScript实现

对其他动态规划问题感兴趣的,也可以查看详解动态规划最少硬币找零问题--JavaScript实现详解动态规划最长公共子序列--JavaScript实现一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写…

车辆占用应急车道识别抓拍系统 opencv

车辆占用应急车道识别抓拍系统通过opencvpython人工智能识别技术,对高速公路应急车道进行不间断实时监测,当监测到应急车道上有车辆违规占用时,立即告警提醒后台人员及时处理避。OpenCV的全称是Open Source Computer Vision Library&#xff…

【18】C语言 | 数组详解

目录 1、数组的格式 2、下列有什么区别 3、维数组的使用 4、*p 和 int* p arr 的含义 5、二维数组:打印一个二维数组 6、二维数组在数组中的存储 7、数组作为函数参数 8、数组名是数组首元素的地址 1、数组的格式 数组是一组相同类型元素的集合。 数组的创…

20230123英语学习

Interesting Studies to Spark Your Interest in the Research Field 科研也可以很有趣!盘点那些好玩的研究 When it comes to picking studies worth reading, what scientists deem an interesting science article might be perceived differently by a person…

【Datewhale一起吃瓜 Task2】啃瓜第三章

文章目录线性模型关键:找到合适的w和b如何找到合适的 w和b?偏导为什么可以?推广线性模型 任务:找出一条线能够对数据进行划分或预测趋势 关键:找到合适的w和b 更适合于连续性的数值,如果数据是离散的如色…

AcWing 1020. 潜水员(二维费用背包)

一、问题 二、思路 这道题其实很容易看出是一个二维费用背包的变形,如果我们将氧气看作体积,将氮气看作价值的话,这道题就变成了从iii个物品里面选,体积至少为mmm,价值至少为nnn的条件下,所携带的物品的最…

Maplab:一个用于视觉惯性建图和定位研究的开源框架

摘要 鲁棒且精确的视觉惯性估计是当今机器人领域的重要挑战。能够用先验地图(prior map)进行定位(localize)并获得准确且无漂移的姿态估计,可以推动该系统的适应性。然而,目前大多数可用的解决方案都集中在单次使用,缺乏定位能力或端到端流水…

Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

[1] 先讨论一个面试题 int a 1; Integer b 1; Integer c new Integer(1); Integer d Integer.valueOf(1); int e d; int f d.intValue();请问以下式子的值?为什么? a b // true a c // true b c // false[2] ""与"equals"…

C++设计新思维(泛型编程与设计模式之应用)之常整数映射为类别(2.4)

技术 模板偏特化,模板全特化 应用 1、有必要根据一个编译期常数调用一个或数个不同的函数 2、有必要在编译器实施"分派"(dispatch) 例子 如果打算在执行期进行分派(dispatch),可使用if-else或switch语句。大部分时候其执行期成本都微不足…

windows权限维持方法详解

权限维持在获取服务器权限后,为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失,测试人员往往需要采取一些手段来实现对目标服务器的持久化访问。权限持久化(权限维持)技术就是包括任何可以被测试人员用来在系统重启、…