首页 > 其他分享 >BigKey问题

BigKey问题

时间:2024-03-21 16:36:55浏览次数:36  
标签:AOF key Redis 阻塞 问题 BigKey 内存 Key

  当 AOF 日志写入了很多的大 Key,AOF 日志文件的大小会很大,那么很快就会触发 AOF 重写机制。

  当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。

  AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过 fork() 函数创建一个子进程来处理任务。会有两个阶段会导致阻塞父进程(主线程):

  • 创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;
  • 创建完子进程后,如果父进程修改了共享数据中的大 Key,就会发生写时复制,这期间会拷贝物理内存,由于大 Key 占用的物理内存会很大,那么在复制物理内存这一过程,就会比较耗时,所以有可能会阻塞父进程。

大 key 除了会影响持久化之外,还会有以下的影响。

  • 客户端超时阻塞。由于 Redis 执行命令是单线程处理,然后在操作大 key 时会比较耗时,那么就会阻塞 Redis,从客户端这一视角看,就是很久很久都没有响应。

  • 引发网络阻塞。每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。

  • 阻塞工作线程。如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。

  • 内存分布不均。集群模型在 slot 分片均匀情况下,会出现数据和查询倾斜情况,部分有大 key 的 Redis 节点占用内存多,QPS 也会比较大。

如何避免大 Key 呢?

  最好在设计阶段,就把大 key 拆分成一个一个小 key。或者,定时检查 Redis 是否存在大 key ,如果该大 key 是可以删除的,不要使用 DEL 命令删除,因为该命令删除过程会阻塞主线程,而是用 unlink 命令(Redis 4.0+)删除大 key,因为该命令的删除过程是异步的,不会阻塞主线程。

标签:AOF,key,Redis,阻塞,问题,BigKey,内存,Key
From: https://www.cnblogs.com/cjhtxdy/p/18087666

相关文章

  • CSS问题精粹1
    1.关于消除<li>列表前的符号我相信很多人在初学CSS时会遇到该问题,无论是创作导航,还是列表,前面都会有个黑点点或其它符号。解决该问题其实很简单采用list-style-type:none或list-style:none直接解决如果你想更换前面的黑点点,换成其他符号或图片图标请看下面------>>>>>>......
  • 什么是跨域请求,如何解决跨域请求的问题?
    在前端开发中,跨域请求是一个经常被提及的话题。了解跨域请求的概念及解决方法,是每位前端工程师必备的技能之一。本文将会深入探讨跨域请求的定义、原因以及如何解决跨域请求的问题。什么是跨域请求?跨域请求指的是在浏览器端,当前页面的域与请求目标资源的域不一致,导致浏览......
  • 解决System.Data.SQLite 32和64位版本兼容问题
    SQLite数据库小巧轻量、免费开源,在中小型项目或移动端项目经常使用,在Windows桌面端需要使用System.Data.SQLite.dll文件,版本特别多,可仔细阅读官方文档了解它们的区别。本文介绍如何兼容32位和64位的方法。类库下载在官网下载非混合模式程序集,非混合模式文件大小只有382kb,而且混......
  • 测试面经 之 如何判断 Bug 是前端问题还是后端问题
    常见软件测试问题,如何判断一个Bug是Bug,并且如何判断该bug是前端问题还是后端问题。1.记录Bug:首先,作为一个专业的测试,无论该bug怎样,是否太浅显,都需要及时记录该问题。将该问题的标题,问题描述,复现步骤,环境版本,测试环境,测试账号,服务器端日志,报错截图,接口入参和......
  • 探索AI运用:如何使用ChatGPT解决问题(一)
    前言:本篇文章是我小白的学习之路,我走过很多弯路,花过很多冤枉的时间,写这篇文章也是我希望各位小白能够少走弯路,虽然站在巨人的肩膀上看的更远,但是踩在我的经历上小白的你,能节约找素材很多时间。第一部分:AI运用的基础知识人工智能(ArtificialIntelligence,简称AI)是一项涉及模......
  • 操作系统综合题之“用记录型信号量机制的wait和signal操作来解决了由北向南和由南向北
    1.问题:假设系统有三个并发进程read、move和print共享缓冲区B1和B2。进程read负责从输入设备上读取信息,每读取一条记录后把它存如缓冲区B1中;进程move负责从缓冲区B1中取出一条记录,整理后放入缓冲区B2;进程print负责将缓冲区B2中的记录取出并打印输出。缓冲区B1和B2每次只能存放1个......
  • 解决position:fixed导致下层组件覆盖问题
    [解决position:fixed导致下层组件覆盖问题-掘金](https://juejin.cn/post/6986935474635931656)问题描述当上层组件固定(多见于导航栏的css样式)时,易造成下层组件被覆盖的问题。我们来写一个案例,当fixed样式未被使用时,我们的组件样式如下:<!DOCTYPEhtml><htmllang="en"><he......
  • ubuntu18.04在下载编译Realsense-ros遇到的问题
    要注意的是,我是用小鱼的一键安装ros安装的ros,链接可以参考我的一篇文章开头有:ubuntu18.04系统中运行./build_ros.sh的时候遇到报错-CSDN博客我遇到的问题是csdn上搜不到的问题:CMakeErrorat/opt/ros/melodic/share/catkin/cmake/catkin_workspace.cmake:100(message): ......
  • CSIE3310操作系统线程包问题
    机器问题1-线程包CSIE3310-操作系统:100TA时间截止日期前10:00-12:00,中船重工R428号楼目录1摘要12环境设置23第1部分(60分)23.1功能说明。2.3.2样本输出。3.4第2部分(40分)44.1功能说明。4.4.2提醒。4.4.3样本输出。5.5运行公共测试用例56提交和分级56.1源代码。5.6.2解压缩后的文件夹......
  • vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支
    效果图在vue2、vue3项目开发中,使用element饿了么组件库,实现Table表格组件动态懒加载表格数据,可以决定是否自动展开所有2级或3级,也可以点击加载下级数据,可搭配表格的增删改查,数据变化后自动更新列表不会破坏树状的展开和折叠结构。提供详细示例代码,一键复制运行查看效果,稍......