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. 团队协作和优化文化

在这里插入图片描述

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

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

相关文章

[操作系统] 深入理解约翰·冯·诺伊曼体系

约翰冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12月28日—1957年2月8日&#xff09;&#xff0c;原名诺伊曼亚诺什拉约什&#xff08;Neumann Jnos Lajos&#xff09;&#xff0c;出生于匈牙利的美国籍犹太人数学家&#xff0c;20世纪最重要的数学家之一&#xf…

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术&#xff0c;其基本原理在于通过计算图像模板中邻域内的均值和方差&#xff0c;选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明&#xff1a; 一、基本思想 Kuwahara滤波的基本思想…

vue项目引入阿里云svg资源图标

1&#xff1a;生成svg图标 登录阿里云官网 1.1 创建项目组 1.2 从阿里云网站上面获取喜欢的图标加入到已有的项目组 1.3 如果团队有自己的设计师&#xff0c;也可以让设计师上传自己的svg图标到阿里云指定的项目组&#xff1b; 使用的时候&#xff0c;把 资源包下载到本地项…

软件测试 —— 自动化测试(Selenium)

软件测试 —— 自动化测试&#xff08;Selenium&#xff09; 什么是SeleniumPython安装Selenium1.安装webdirver-manager2.安装Selenium 写一个简单用例CSS_SELECTOR和XPATH浏览器快速定位页面元素浏览器的前进&#xff08;forward&#xff09;&#xff0c;后退&#xff08;bac…

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的不断进步和电商行业的快速发展&#xff0c;传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生&#xff0c;通过精准定位、用户细分以及深度社交传播策略&#xff0c;实现了用户群体的快速裂变与高效营…

Jmeter进行http接口并发测试

目录&#xff1a; 1、Jmeter设置&#xff08;1&#xff09;设置请求并发数&#xff08;2&#xff09;设置请求地址以及参数&#xff08;3&#xff09;添加结果数 2、启动看结果 1、Jmeter设置 &#xff08;1&#xff09;设置请求并发数 &#xff08;2&#xff09;设置请求地址…

有一台服务器可以做哪些很酷的事情

有一台服务器可以做哪些很酷的事情 今天我也来简单分享一下&#xff0c;这几年来&#xff0c;我用云服务器做了哪些有趣的事情。 服务器推荐 1. 个人博客 拥有个人服务器&#xff0c;你可以完全掌控自己的网站或博客。 与使用第三方托管平台相比&#xff0c;你能自由选择网站…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

从网络的角度来看,用户输入网址到网页显示,期间发生了什么?

步骤&#xff08;总体来看&#xff09; 浏览器根据输入网页的URL进行解析&#xff0c;解析出对应的请求方式、URL、端口等&#xff0c;生成HTTP请求报文。浏览器查询缓存&#xff0c;检查缓存是否已经存在该URL的资源&#xff0c;如果缓存命中中直接读取并显示&#xff0c;比如…

MYSQL创建表

1.要求 2.步骤 1.创建数据库: create database mydb6_product;2.使用数据库: use mydb6_product;3.创建employees表&#xff1a; create table employees(id int primary key,name varchar(50) not null, age int not null,gender varchar(10) not null default unknown&…

计算机网络的五层协议

计算机网络的五层协议 ‌计算机网络的五层协议模型包括物理层、数据链路层、网络层、传输层和应用层&#xff0c;每一层都有其特定的功能和相关的协议。‌‌1 ‌物理层‌&#xff1a;负责传输原始的比特流&#xff0c;通过线路&#xff08;有线或无线&#xff09;将数据转换为…

C语言初阶习题【30】字符串左旋

1. 题目描述——字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 2. 思路 先思考了下如何把最前面的字符串移到后面。 思路比较简单&#xff0c;就是把第一个字符保存下来&#xf…

ESP8266固件烧录

一、烧录原理 1、引脚布局 2、引脚定义 3、尺寸封装 4、环境要求 5、接线方式 ESP8266系列模块集成了高速GPI0和外围接口&#xff0c;这可能会导致严重的开关噪声。如果某些应用需要高功率和EMI特性&#xff0c;建议在数字I/0线上串联10到100欧姆。这可以在切换电源时抑制过冲…

word-break控制的几种容器换行行为详解

word-break 属性在控制换行行为时需要根据语言判断&#xff0c;对于中文 一个字符就是一个单词&#xff0c;字符换行不影响阅读理解&#xff0c;而对于英文来说&#xff0c;多个连续的字符才会是一个单词&#xff0c;例如中文的 早 英文为 morning。 morning7个字符才算一个单词…

年后找工作需要注意的事项

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…

Windows 10 ARM工控主板连接I2S音频芯片

在Windows工控主板应用中&#xff0c;音频功能是一项基本的需求&#xff0c;USB声卡在x86/x64 Windows系统上就可直接免驱使用&#xff0c;但这些USB声卡通常不提供ARM上的Windows系统驱动。本文将介绍如何利用安装在ARM上的Windows工控主板——ESM8400的I2S接口、连接WM8960音…

机器学习实战33-LSTM+随机森林模型在股票价格走势预测与买卖点分类中的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战33-LSTM随机森林模型在股票价格走势预测与买卖点分类中的应用。对于LSTM随机森林模型的融合应用&#xff0c;我们选择股票价格走势预测与买卖点分类作为应用场景。股票市场数据丰富且对投资者具有实际价…

在VS2022中用C++连接MySQL数据库读取数据库乱码问题

1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 &#xff08;1&#xff09;右键项目&#xff0c;打开属性 注意是右键项目&#xff0c;不是.cpp文件 &#xff08;2&#xff09;配置属性-> VC目录 -> 包含目录 ->添加头文件路径&#xff08;如图&am…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…