Redis--21--大Key问题解决方案

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

文章目录

  • 前言
        • Redis--20--大Key问题解析
  • 一、如何发现Redis大Key
    • 1. 使用Redis命令行工具
      • **MEMORY USAGE**
      • **RANDOMKEY**
      • **DEBUG OBJECT**
      • **SCAN命令**
      • **redis-cli 工具:**
    • 2. 使用监控工具
      • 2.1 Redis自带的慢查询日志
      • 2.2 第三方监控平台
      • 2.3 专用大Key扫描工具
    • 3. 定期巡检和自动化告警
  • 二、如何解决大key问题
    • 1.删除大key
      • 异步UNLINK命令
      • SCAN命令
    • 2.压缩和拆分key (不可删除数据)
    • 1.压缩算法、
      • 使用 Redis 的数据结构
    • 2.拆分大 Key
    • 3.分片
  • 三、实际案例分析
    • 案例1:线上服务因大Key删除导致卡顿
    • 案例2:数据迁移中的大Key问题
    • 案例3:社交媒体应用中的大列表
    • 案例4:电商平台中的大哈希表
    • 案例5:日志系统中的大集合
  • 四、经验总结和最佳实践
    • 1. 日常监控和巡检
    • 2. 合理的容量规划
    • 3. Redis使用的常见陷阱及规避方法
    • 4. 工具和脚本的高效利用
    • 5. 团队协作和优化文化


前言

Redis–20–大Key问题解析

一、如何发现Redis大Key

在排查Redis性能问题时,发现和定位大Key是解决问题的关键步骤。以下是一些常用的方法和工具,可以帮助识别和诊断Redis中的大Key。

1. 使用Redis命令行工具

Redis 提供了一些工具和命令来识别大 Key:

MEMORY USAGE

  • 作用:返回指定Key的内存占用大小(以字节为单位)。
示例:
MEMORY USAGE mykey
  • 输出结果会显示该Key的大小,通过与其他Key对比,可以发现异常占用内存的大Key。

RANDOMKEY

  • 作用:随机返回一个Key,用于抽样分析。
示例:
RANDOMKEY
  • 配合MEMORY USAGE或DEBUG OBJECT命令,可以抽样检查Key的大小和属性。

DEBUG OBJECT

  • 作用:提供关于Key的详细调试信息,包括编码方式和元素个数。
示例:
DEBUG OBJECT mykey
  • 输出信息中的serializedlength字段可作为判断Key大小的重要依据。

SCAN命令

  • 作用:增量遍历Redis中的Key,适合在大数据量环境下使用。
示例:
SCAN 0 MATCH * COUNT 100
  • 遍历过程中结合MEMORY USAGE或其他分析工具,可以识别出大Key。

redis-cli 工具:

  • 作用:可以使用 redis-cli 命令来查找和分析大 Key。
示例:
redis-cli --bigkeys

2. 使用监控工具

2.1 Redis自带的慢查询日志

  • 配置SLOWLOG参数,记录执行时间较长的命令。
示例:
SLOWLOG GET 10
  • 通过分析慢查询日志,可以定位哪些操作耗时过长,并进一步确认是否因大Key导致。

2.2 第三方监控平台

  • Prometheus + Grafana:通过Redis Exporter收集监控数据,设置内存占用、命令执行时间等指标的报警规则。
  • Datadog:可视化展示Redis实例的性能数据,包括每个Key的内存占用。
  • 阿里云、腾讯云等云监控工具:对Redis实例进行实时分析,快速定位异常Key。

2.3 专用大Key扫描工具

  • 开源工具如redis-rdb-tools:通过分析RDB文件识别大Key。
  • 在线扫描工具:通过API或脚本对Key逐个检查,生成大Key列表。

3. 定期巡检和自动化告警

  • 定期巡检脚本
    • 定时运行扫描脚本,生成大Key报告。
    • 将结果输出到日志或发送邮件告警。
  • 设置监控阈值
    • 配置Redis监控指标,如单个Key的最大内存占用。
    • 通过自动化告警(如邮件、短信、钉钉机器人)及时通知异常。

在这里插入图片描述

二、如何解决大key问题

  • 根据大key的实际用途可以分为两种情况:可删除和不可删除。

在这里插入图片描述

1.删除大key

如果发现某些大key并非热key就可以在DB中查询使用,则可以在Redis中删掉:

异步UNLINK命令

当Redis版本大于4.0时,可使用UNLINK命令安全地删除大Key,该命令能够以非阻塞,异步执行的方式,逐步地清理传入的Key。

  • Redis UNLINK 命令类似与 DEL 命令,表示删除指定的 key,如果指定 key 不存在,命令则忽略。
  • UNLINK 命令不同与 DEL 命令在于它是异步执行的,因此它不会阻塞。
  • UNLINK 命令是非阻塞删除,非阻塞删除简言之,就是将删除操作放到另外一个线程去处理。
UNLINK mykey

SCAN命令

当Redis版本小于4.0时,避免使用阻塞式命令KEYS,而是建议通过SCAN命令执行增量迭代扫描key,然后判断进行删除。
在这里插入图片描述

2.压缩和拆分key (不可删除数据)

  • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。
  • 当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。
  • 当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。

1.压缩算法、

  • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。

使用 Redis 的数据结构

根据数据的特性选择合适的 Redis 数据结构。Redis 提供了多种数据结构(如列表、集合、有序集合、哈希表),可以根据实际需求选择合适的数据结构来优化存储和访问性能。

示例:使用哈希表优化存储

  • 替代长列表或大字符串:

HSET user🔢name “John” user🔢age “30”

2.拆分大 Key

  • 将大 Key 拆分为多个小 Key 是一种常见的优化策略。例如,将一个大的列表拆分为多个小列表,或者将一个大的哈希表拆分为多个小哈希表。这样可以减少单个操作对性能的影响。
// 原始大哈希表
HSET largeHash key1 value1
HSET largeHash key2 value2
...
 
// 拆分为多个小哈希表
HSET smallHash1 key1 value1
HSET smallHash2 key2 value2
...

3.分片

  1. 如果一个List或Set数据量过大,可以通过分片技术将其拆分成多个Key:
  2. 按照业务逻辑对数据进行分片,将其拆分为多个Key,并进行并行操作。

示例:存储用户订单数据时,可以按照用户ID进行分片。

list:0, list:1, list:2 …

三、实际案例分析

案例1:线上服务因大Key删除导致卡顿

在这里插入图片描述
在这里插入图片描述

案例2:数据迁移中的大Key问题

在这里插入图片描述
在这里插入图片描述

案例3:社交媒体应用中的大列表

在这里插入图片描述
解决方案:

  1. 拆分好友列表:将每个用户的好友列表拆分为多个小列表,例如按字母顺序或好友的加入时间进行分组。
// 将一个大的好友列表拆分为多个小列表
String userId = "user:12345";
String[] friends = getFriends(userId);
for (int i = 0; i < friends.length; i += 1000) {
    String smallListKey = userId + ":friends:" + (i / 1000);
    List<String> smallList = Arrays.asList(Arrays.copyOfRange(friends, i, Math.min(i + 1000, friends.length)));
    redisClient.rpush(smallListKey, smallList.toArray(new String[0]));
}
  1. 优化查询:在查询好友列表时,根据实际需要选择查询具体的小列表而不是整个大列表。

案例4:电商平台中的大哈希表

在这里插入图片描述

解决方案:

  1. 拆分大哈希表:将每个产品的哈希表拆分为多个小哈希表,按照不同的信息类型进行分组。例如,将库存和价格信息分开存储。
// 拆分大哈希表
String productId = "product:12345";
Map<String, String> productDetails = getProductDetails(productId);
 
// 存储库存信息
redisClient.hset(productId + ":stock", productDetails.get("stock_key"), productDetails.get("stock_value"));
 
// 存储价格信息
redisClient.hset(productId + ":price", productDetails.get("price_key"), productDetails.get("price_value"));
  1. 定期压缩:定期压缩和优化哈希表的数据结构,删除不再需要的信息,以减少存储和操作的复杂性。

案例5:日志系统中的大集合

在这里插入图片描述

四、经验总结和最佳实践

在实际生产环境中,合理应对Redis大Key问题需要结合预防、监控和优化的多种手段。以下是一些经验总结和最佳实践,帮助开发和运维团队更高效地管理Redis系统。

1. 日常监控和巡检

在这里插入图片描述

2. 合理的容量规划

在这里插入图片描述

3. Redis使用的常见陷阱及规避方法

在这里插入图片描述

4. 工具和脚本的高效利用

在这里插入图片描述

5. 团队协作和优化文化

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【进程与线程】进程的状态

在操作系统中&#xff0c;进程是执行中的程序实例。进程在其生命周期中会经历不同的状态&#xff0c;操作系统根据进程的执行情况和资源调度&#xff0c;将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。 进程的状态&#xff1a;就绪态&#xff0…

K8S开启/关闭审计日志

K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置&#xff0c;可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器&#xff0c;开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…

nginx: [emerg] bind() to 0.0.0.0:80 failed 端口被占用

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 查看被占用的端口 被系统占用了 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/HTTP 然后再进入nginx文件夹目录下…

vue2 web 多标签输入框 elinput是否当前焦点

又来分享一点点工作积累及解决方案 产品中需要用户输入一些文字后按下回车键生成标签来显示在页面上&#xff0c;经过尝试与改造完成如下&#xff1a; <template><div class"tags-view" click"beginInput"><el-tag :key"index" …

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM&#xff08;官方网址&#xff1a;https://www.vllm.ai&#xff09;是一种用于大规模语言模型&#x…

STM32的集成开发环境STM32CubeIDE安装

STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics

硬件学习笔记--31 IEC62053-21相关内容介绍

IEC 62053-21是一项由国际电工委员会&#xff08;International Electrotechnical Commission&#xff0c;简称IEC&#xff09;发布的国际标准&#xff0c;全称为《交流电能测量设备&#xff08;a.c.&#xff09;-特殊要求-第21部分&#xff1a;静止式有功能量计量表&#xff0…

C++类与对象(一)—学习记录

序言&#xff1a;要想开发一款成功的应用程序&#xff0c;其开发者必须充分了解并实现用户的需求。作为一个设计良好的类&#xff0c;既要有直观且易于使用的接口&#xff0c;也必须具备高效的实现过程。 一、类与对象基本概念 面向对象程序设计的主要特点为抽象、封装、继承与…

七大排序算法

文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间&#xff08;仅供参考&#xff09; 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈&#xff0c;已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中&#xff0c;设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块&#xff0c;以…

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…

第十三章:数据库技术

文章目录&#xff1a; 一&#xff1a;基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二&#xff1a;Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络&#xff08;RPN&#xff09; 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

浏览器输入http形式网址后自动跳转https解决方法

一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况&#xff1a; 在浏览器中输入“http域名”后会自动变成“https 域名”的形式&#xff0c;此时“https 域名”的网站可能已停止对外提供服务了&#xff0c;这时会出现如下不友好的网页提示&#xff1a; 二、处理方法&#x…

Unity2017 控制.abc格式的三维动画播放

首先需要导入插件Alembic&#xff0c;否则导入abc动画&#xff0c;Unity是不会识别的。 Unity2017版本及以下直接从我这儿下载&#xff1a;https://download.csdn.net/download/qq_41603955/90272382 高版本Unity&#xff0c;请移步AssetStore商店搜找。 导入abc之后&#x…

python管理工具:conda部署+使用

python管理工具&#xff1a;conda部署使用 一、安装部署 1、 下载 - 官网下载&#xff1a; https://repo.anaconda.com/archive/index.html - wget方式&#xff1a; wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…

挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注

挖掘机检测数据集&#xff0c;准确识别率91.0%&#xff0c;4327张图片&#xff0c;支持YOLO&#xff0c;COCO JSON&#xff0c;PASICAL VOC XML等多种格式标注 数据集详情 数据集分割 训练组70&#xff05; 3022图片 有效集20&#xff05; 870图片 测试集10&…

vue 学习笔记 - 创建第一个项目 idea

1、安装Vue CLI 查看npm版本号 &#xff08;可跳过&#xff09; % npm -v 11.0.0安装Vue CLI % npm install -g vue/cli2、创建项目 进入工程文件目录 % cd /Users/ruizhifeng/work/aina-client查看vue 版本号 &#xff08;可跳过&#xff09; % vue --version vue/cli 5…

BIO、NIO、AIO

第一章 BIO、NIO、AIO课程介绍 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺…

SpringMVC复习笔记

文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步&#xff1a;导入依赖第二步&#xff1a;Controller 层开发第三步&#xff1a;SpringMVC 配置类配置核心组件第四步&#xff1a;SpringMVC 环境搭建第五步&#xff1a;部…