面试题:说一下Redis中有哪些阻塞点以及如何解决?

文章目录

  • 前言
  • 有哪些影响redis性能的因素
  • 客户端的阻塞
  • 磁盘带来的阻塞
  • 主从节点带来的阻塞
  • 切片集群的阻塞
  • 异步机制解决阻塞
  • 异步是如何进行的
  • 异步删除lazy-free
  • 小结


Redis 中的优秀设计有很多,今天我们一起来聊聊群友刷题遇到的:“Redis的异步机制 —— redis有哪些阻塞点以及如何解决?”

前言

说到 Redis,大家自然而然的会想到基于内存、单线程执行等。话说回来,Redis 真的只有单线程吗?这篇文章来说说 Redis 的异步机制。

在这里插入图片描述


有哪些影响redis性能的因素

我们从 Redis 内部及外部因素总结一下,主要有:

  1. redis 内部的阻塞式操作
  2. CPU 核和 NUMA 架构的影响
  3. Redis 关键系统配置
  4. Redis 内存碎片
  5. Redis 缓冲区

首先说说 Redis 实例的阻塞点:

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

客户端的阻塞

因 Redis 使用了 IO 多路复用机制,能避免主线程一直处于等待状态,网络 IO 不是导致 Redis 阻塞的因素。

而键值对的增删改查是主线程的主要工作,复杂度高的操作当然会阻塞Redis了。我们去判断复杂度高不高的标准就是看操作的复杂度是否为O(N),也就是否要全表扫描。比如hgetall, smembers等操作就属于复杂度高的了。

然后还要注意的一个点就是数据的删除。删除本质上来说就是对键值对的内存空间进行释放。在释放内存时,操作系统需要将释放掉的内存块插入一个空闲内存块的链表,以便后续管理和再分配。这个过程会阻塞当前释放内存的应用程序。

如果这个键值对数据很大,比如一个 zset 包含大量元素,就会释放大量的内存。有测试过删除 100 万个元素的集合时,删除时间会达到 2s,要知道 Redis 的响应是毫秒级别的。所以这种 bigkey 的删除也会成为 Redis 的阻塞点。

清空数据库(flushdb、flushall)也涉及到删除和释放所有的键值对,也是 Redis 的阻塞点。

磁盘带来的阻塞

AOF重写和RDB快照,Redis都用了子进程的方式操作,所以不会阻塞主线程。但Redis直接记录AOF日志,若有大量的写操作,并且配置的是同步写回的话,就会阻塞主线程了。

主从节点带来的阻塞

在主从集群中,主库生成 RDB 文件,并传输给从库。主从复制过程的创建和传输 RDB 都是子进程处理的,不会阻塞主线程。但是从库在接收了 RDB 文件后,需要使用 FLUSHDB 命令清空当前数据库,这又是一个阻塞点。而且,在从库清空数据库后,需要将 RDB 文件加载到内存,快慢和 rdb 文件大小相关。加载 RDB 文件又是一个阻塞点。

切片集群的阻塞

切片集群的实例在负载均衡或者实例增加删除时,数据迁移是渐进式操作的,所以不会阻塞主线程。
总结一下,Redis 就有 5 个阻塞点:

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

异步机制解决阻塞

我们通过异步的方式,去解决可能阻塞的场景。但也不是每个操作都能用异步的方式去解决。如果一个操作能够异步执行,说明客户端不需要马上得到具体值,在Redis中描述为「若一个操作能异步执行,就意味着它不是主线程的关键路径的操作。」

对于第一个阻塞点,因为读操作需要等待数据的返回,所以「第一个阻塞点不能异步执行。」 第二个阻塞点和第三个阻塞点,因为删除不需要返回具体的结果,因此都可以用子线程去异步执行。「第四个阻塞点“AOF日志同步写”,也可启动子线程操作,不用让主线程等待AOF日志的写完成。」 第五个阻塞点 「“从库加载 RDB 文件”,从库要想对客户端提供数据存取服务,就必须把RDB文件加载完成,不能启用子进程。」

异步是如何进行的

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

异步删除lazy-free

lazy-free 机制是 Redis 收到删除指令后,主线程会将这个操作放入队列,然后马上给客户端返回一个完成信息。实际上删除还没执行呢。lazy-free 是 Redis4.0 之后才有的功能,需要手动开启。需要注意的是,即使开启了 lazy-free,如果直接使用 DEL 命令还是会同步删除 key,只有使用 UNLINK 命令才会可能异步删除 key。而且 Redis 在删除一个 key 时,首先会评估删除的时间成本,如果成本小,也不会异步执行,直接用主线程就完成返回了。


小结

本文总结 Redis 有哪些阻塞点,以及这些阻塞点是否可用异步机制去解决。但我们在使用 Redis 时,还是要避免 bigkey 的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud之OpenFeign调用解读

目录 基本介绍 引进 OpenFeign概述 OpenFeign作用 FeignClient EnableFeignClients Java代码实战 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 自定义配置 基本介绍 引进 如果我们利用RestTemplate发起远程调用的代码时会存在一些…

如何正确维护实验室超声波清洗机

实验室一直被视作一个严谨且严肃的场所,在其中所做的试验都需要遵照一定流程,所用的设备也经过了细致化挑选,例如实验室超声波清洗机,其性能远强于普通类别的清洗机。专门负责采购的实验室人员,通常会对质量优服务好的…

C# Onnx Yolov8 Detect 戴安全帽检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

外贸找客户软件:BotMaster 2023 Crack

具有多设备支持的全新 WhatsApp™ Business 批量发送器 最新9.0.2.1 稳定且工作。 测试日期:2023 年 10 月 9 日 所有功能工作正常。 图像发送问题固定 数字过滤器和组抓取器已修复。 目前稳定 现在使用 BotMaster 9.0.2.1 从 WhatsApp™ 发送交互式按钮 您现在可以…

uniapp开发微信小程序,webview内嵌h5,h5打开pdf地址,解决方案

根据公司要求,让我写一个h5,后续会嵌入到合作公司的微信小程序的webview中,如果是自己公司微信小程序,可以采取先下载下来pdf,然后通过wx.openDocument,进行单纯的预览操作,这个可以根据这个老哥…

轻松合并Excel工作表:Java批量操作优化技巧

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在Excel中设计表单时,我们经常需要对收集的信息进行统计分析。例如&a…

C++前缀和算法:生成数组原理、源码及测试用例

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划,日后完成。 题目 给定三个整数 n、m 和 k 。考虑使用下图描述的算法找出正整数数组中最大的元素。 请你构建一个具有以下属性的数组 arr &#…

Photon——Fusion服务器(Failed to find entry-points:System.Exception: )

文章目录 前言解决方案:1.报警信息如下2.选择3d urp3.引入Fusion之后选择包管理,点击Burst中的Advanced Project Settings4.勾选两个预设选项5.引入官网unity.burst6.更新后报警消失总结前言 制作局域网游戏,出现未找到进入点报警 Failed to find entry-points 解决方案: …

计算机中整数的补码表示及二进制数轮

为了同学们能理好的理解数在计算机内的表示,我们可以把计算机中的整数看成N位进制数的数轮,N一般为2的幂,如下: 我们来举个例子:如果用4位二进制来表示整数,则可以表示的整数范围为-8(即&#x…

车规MCU开发工具之Vector DaVinci Configurator执行arxml合并操作

环境 Step1 导入要合并的arxml 、 Step 2 比较、合并过程 <完>

【MySQL】逻辑架构

逻辑架构 逻辑架构剖析服务器处理客户端请求连接层服务层SQL Interface : SQL接口Parser : 解析器Optimizer : 查询优化器Caches&Buffers : 查询缓存组件 引擎层存储层 SQL执行流程MySQL查询流程查询缓存解析器词法分析语法分析 优化器执行器 数据库缓冲池 逻辑架构剖析 服…

优雅的用户体验:微信小程序中的多步骤表单引导

前言 在微信小程序中&#xff0c;实现一个多步骤表单引导界面既可以提供清晰的任务指引&#xff0c;又可以增加用户体验的互动性。本文将探讨如何使用微信小程序的特性&#xff0c;构建一个流程引导界面&#xff0c;帮助用户一步步完成复杂任务。我们将从设计布局和样式开始&am…