当前位置: 首页 > news >正文

Redis--20--大Key问题解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 大Key问题
    • 1.什么是 Redis 大 Key?
        • 在 Redis 中,大 Key 是指==单个键值对==的数据量非常大,可能包含大量数据。
    • 2. Redis大Key的危害
    • 3.大key、热key的产生原因:
    • 4.为什么需要关注大Key问题?
  • Redis大Key引发的线上事故场景
    • 1. 常见事故场景描述
      • 1.1 **操作大Key导致Redis阻塞**
      • 1.2 大Key迁移时的性能问题
      • 1.3 慢查询和超时的影响
    • 2. 事故表现及影响
      • 2.1 业务卡顿
      • 2.2 系统不可用
      • 2.3 难以快速恢复


大Key问题

大Key并不直接导致系统问题,但其潜在影响和风险非常显著,尤其在生产环境中。
在这里插入图片描述

1.什么是 Redis 大 Key?

在 Redis 中,大 Key 是指单个键值对的数据量非常大,可能包含大量数据。

Redis大Key是指单个Key对应的数据量过大,占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种:

  • String类型:单个字符串的长度过大。
  • List类型:包含大量元素的列表。
  • Hash类型:存储大量字段的哈希表。
  • Set或ZSet类型:存储大量成员的集合或有序集合。

数值参考
在这里插入图片描述

2. Redis大Key的危害

  • 性能瓶颈:对大Key的读写操作可能占用过多的CPU资源,导致其他操作延迟。

  • 阻塞问题:一次性删除大Key或迁移大Key时,Redis可能出现阻塞,从而影响整个服务。

  • 内存压力:大Key会占用大量内存,增加内存碎片化的风险,并可能触发Redis的内存淘汰机制。

  • 恢复缓慢:当需要从快照(RDB)或日志(AOF)中加载数据时,大Key会显著延长恢复时间。

具体

  1. 对Redis的请求变慢。
  2. Redis内存不断变大引发OOM,或达到maxmemory值引发写阻塞或重要Key被逐出。
  3. Redis Cluster中的某个node内存远超其余node。
  4. 由于对大key的请求很慢,容易造成请求的阻塞,在分布式架构下容易造成服务雪崩。
  5. 删除一个大Key很耗时,容易造成主结点阻塞,从而主从切换。

3.大key、热key的产生原因:

  • 存放不合理,存储了不适合存放在内存中的数据,如用key存放音频视频这一类大体积二进制文件(大key)。
  • 设计不合理,造成个别key中成员过多。(大key)。
  • 未定期清理数据,没有设置过期时间,造成了如hash类型中key中的成员不断增加。
  • 流量陡增,如出现某款爆款商品等(热key)。
  • bug,代码的业务逻辑上对key的成员只增不减也未设置过期时间。

4.为什么需要关注大Key问题?

在生产环境中,Redis被广泛用作缓存和数据库,如果忽略大Key问题,可能导致以下后果:

  1. 线上事故频发:由于Redis本身是单线程模型,大Key的操作会阻塞主线程,影响所有客户端请求。
  2. 业务中断:高延迟甚至不可用的情况会对业务造成直接损失。
  3. 运维复杂度增加:需要额外的监控和排查,增加了运维负担。

Redis大Key引发的线上事故场景

1. 常见事故场景描述

1.1 操作大Key导致Redis阻塞

  • Redis是单线程执行命令的,在操作大Key(如读取、更新或删除)时,单次命令可能需要较长时间完成,阻塞其他客户端请求。
  • 例如:使用DEL删除一个包含数百万元素的List或Set时,操作可能耗时几秒甚至更久,导致其他请求无法响应。

1.2 大Key迁移时的性能问题

  • 在Redis进行主从同步或数据迁移时,大Key的传输会占用大量带宽和时间。
    如果迁移操作与正常业务请求同时进行,可能导致Redis服务性能大幅下降,甚至引发业务中断。

1.3 慢查询和超时的影响

  • 对大Key执行复杂操作(如LRANGE、HGETALL、ZRANGEBYSCORE)时,操作时间会随着数据量的增长线性甚至指数级增加,可能触发慢查询或请求超时。
  • 例如:一次性从一个包含百万条数据的List中获取范围数据,容易导致应用程序响应缓慢。

2. 事故表现及影响

2.1 业务卡顿

  • 用户请求无法及时得到响应,表现为接口延迟增加甚至超时。
  • 对于高并发场景,这种情况会进一步放大,导致更多请求堆积。

2.2 系统不可用

  • 阻塞问题可能让整个Redis实例无法响应请求,导致相关业务完全瘫痪。
  • 如果Redis作为缓存使用,缓存不可用会给后端数据库带来极大压力,可能进一步引发数据库瓶颈。

2.3 难以快速恢复

  • 在线上恢复过程中,删除或迁移大Key会进一步延长恢复时间。
  • 大Key也会导致Redis内存碎片增加,可能需要触发MEMORY FRAGMENTATION的手动优化,进一步增加停机时间。

相关文章:

Redis--20--大Key问题解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key?在 Redis 中,大 Key 是指单个键值对的数据量非常大,可能包含大量数据。 2. Redis大Key的危害3.…...

新版2024AndroidStudio项目目录结构拆分

如题 下载了最新版的android studio 发现目录结构和以前不一样 自动帮你合并了 如何层层抽丝剥茧呢 按照一下步骤即可解决问题!...

STM32内置Flash

一、原理 利用flash存储用户数据需要注意查看,用户数据是否会覆盖芯片运行程序。 IAP(在程序中编程)利用程序修改程序本身,和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP(在电路中编程,通…...

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…...

【Linux】深入理解进程信号机制:信号的产生、捕获与阻塞

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 时间不语,却回答了所有问题 目录 📚前言 📚一、信号的本质 📖1.异步通信 📖2.信…...

前端基础技术全解析:从HTML前端基础标签语言开始,逐步深入CSS样式修饰、JavaScript脚本控制、Ajax异步通信以及WebSocket持久通信

目录 前言: 1.前端技术html简单了解: 1.1HTML代码是由标签构成的。 1.2.HTML 文件基本结构 1.3.HTML 常见标签 标题标签: 段落标签: p 文本格式化标签 图片标签: 超链接标签: a 测试代码: 展示效果: 表单…...

Linux存储管理之核心秘密(The Core Secret of Linux Storage Management)

Linux存储管理之核心秘密 如果你来自Windows环境,那么Linux处理和管理存储设备的方式对你而言可能显得格外不同。我们知道,Linux的文件系统并不采用Windows那样的物理驱动器表示方式(如C:、D:或E:),而是构建了一个以&…...

excel精简使用工具

1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据,并且每一行都引用不同的列。为了实现这个目标,你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式,你可以使用以下公…...

Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面

前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…...

为什么页面无法正确显示?都有哪些HTML和CSS相关问题?

页面无法正确显示可能由多种原因导致,通常与HTML和CSS的结构、语法错误、浏览器兼容性、资源加载等问题有关。以下是一些常见的原因及其解决方法,结合实际项目代码示例进行讲解: 1. HTML 结构错误 HTML 标签的缺失或错误可能导致页面无法正…...

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计,以确保内容既专业又吸引人。以下是一个基本的框架和一些建议,帮助您创建一份有效的公司介绍PPT: PPT标题页 标题:公司全称(可使用公司Logo作为背景或嵌入标题中)副标题…...

Selenium 进行网页自动化操作的一个示例,绕过一些网站的自动化检测。python编程

这段代码是使用 Selenium 进行网页自动化操作的一个示例,主要目的是在加载网页时执行一些自定义的 JavaScript 代码,并等待页面上某个元素的出现。以下是代码的详细解释: ### 代码解释 #### 导入必要的模块 python from selenium.webdriver…...

HashMap和HashTable的区别

1、HashMap是线程不安全的,HashTable是线程安全的 HashMap:Fail-fast 机制。表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失…...

使用redis来进行调优有哪些方案?

Redis的调优方案可以从多个方面进行,以下是一些常见的优化方法及代码示例: 1.使用管道(Pipelining) 管道技术可以减少客户端与Redis之间的交互次数,从而提高性能。在批量操作时,通过管道可以一次性发送多个…...

macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc++.h 文件

在 macOS 中,默认的 Clang 编译器和 Homebrew 安装的 GCC 都不包含 bits/stdc.h 文件,因为它是一个 非标准 的头文件,主要由 MinGW 和某些 Linux 平台的 GCC 提供。 解决方案 : 手动创建 bits/stdc.h 1. 创建文件夹和文件 在你的 GCC 标准…...

2012mfc,自绘列表控件

原文 使用常用控件版本4.70中的自定义绘画功能自定义列表控件的外观. 介绍 常见控件的4.70版引入了一项叫自定义绘画的功能. 可按轻量易用的自画版本对待自定义绘画.易用性来自,即只需处理一条消息(NM_CUSTOMDRAW),且你可让窗口为你干活,因此你不必完成物主绘画中的所有粗活…...

vue3运行时执行过程步骤

在 Vue 3 中,运行时的执行过程是一个复杂但高效的机制,主要包括初始化应用、渲染、响应式更新和销毁等阶段。以下是 Vue 3 运行时的执行过程的核心步骤和流程: 1. 应用初始化 1.1 创建 Vue 应用 调用 createApp 方法,创建一个 V…...

常用的AT命令,用于查看不同类型的网络信息

文章目录 1. ATCSQ‌:2. ATCREG‌:‌3. ATCOPS‌:4. ATCGATT‌:5. ATCGPADDR‌: 在AT命令集中,用于查看网络信息的命令有多种,具体取决于所使用的设备和模块。以下是一些常用的AT命令&#xff0…...

Vue3组件通讯——自定义事件(子->父)

需求如下: 1.在子组件中,当用户点击提交按钮后,更新数据库 2.数据更新成功后,子组件通知父组件getUserInfo函数,重新获取数据,同步更新 3.子组件等待getUserInfo函数执行完毕后,调用init函数…...

GLSL 着色器语言

GLSL 着色器语言 1. 着色器语言基础1.1 数据类型1.2 数据类型的基本使用1.3 运算符1.4 各个数据类型的构造函数1.5 类型转换1.6 存储限定符1.7 插值限定符1.8 一致块1.9 layout 限定符1.10 流程控制1.11 函数的声明和使用1.12 片元着色器中浮点及整型变量精度的指定1.13 程序的…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...