Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述

大Key:通常是指值(Value)的长度非常大,实际上键(Key)长度很大也算。通常来说,键本身不会很长,占用的内存较少,因此判断一个键是否为bigKey主要看它对应的值的大小。
大Key分为两种情况:
(1)、键(Key)非常大
(2)、值(Value)非常大

2、键(Key)非常大

虽然Redis的键可以存储任意字符串(最大限制为512M),但通常情况下,键的长度都比较小。

过长的键会带来以下问题:
(1)、内存占用增加:Redis是内存数据库,键的长度直接影响内存使用。如果键的长度过大且大量存在时,会显著增加内存消耗。
(2)、性能下降:Redis的许多操作(如查找、删除、更新等)都需要对键进行哈希计算或字符串比较。如果键的长度过长,这些操作的时间复杂度会增加,导致性能下降。
(3)、网络传输开销:在客户端与Redis服务器之间传输数据时,过长的键会增加网络带宽的使用,尤其是在分布式系统中,可能会导致网络延迟。

什么时候算作"大键"?
- 一般大键:键的长度应尽量保持在100字节以内。超过这个长度的键可以被视为"大键"。
- 极端情况:如果键的长度超过几千字节,则会对Redis的性能产生明显影响,属于典型的"大键"。

如何避免大键?
(1)、使用简短的键名:尽量使用简短且具有描述性的键名。例如,使用user:12345而不是 user_profile_for_user_with_id_12345。
(2)、使用哈希或编码:对于复杂的键名,可以考虑使用哈希函数(如MD5、SHA1)将长字符串转换为固定长度的哈希值,或者使用Base64编码来缩短键的长度。

3、值(Value)非常大

Redis的值可以是多种类型的数据结构,包括字符串、列表、集合、哈希表、有序集合等。当值的大小非常大时,也会对Redis的性能和内存使用产生负面影响。

过长的值带来的问题
(1)、内存占用增加:大值会占用更多的内存,尤其是在Redis中存储大量大值时,可能会迅速耗尽可用内存。
(2)、性能阻塞:某些Redis操作(如GET、SET、DEL等)在处理大值时可能会阻塞Redis服务器,导致其他请求无法及时处理。例如,DEL一个包含数百万元素的列表或哈希表可能会导致Redis在几秒钟内无法响应其他请求。
(3)、网络传输开销:大值在客户端与Redis服务器之间传输时,会增加网络带宽的使用,可能导致网络延迟或超时。
(4)、备份和持久化压力:大值会增加Redis的RDB快照和AOF日志的大小,导致备份和持久化操作的时间变长,甚至可能引发磁盘I/O瓶颈。

什么时候算作"大值"?
- 一般建议:对于字符串类型的值,建议单个值的大小不要超过1MB。对于复杂数据结构(如列表、哈希表、集合等),建议每个元素的大小也应尽量控制在合理范围内。
- 极端情况:如果单个值的大小超过几十MB或几百MB,则会对Redis的性能产生显著影响,属于典型的"大值"。

如何避免大值?
(1)、分片存储:对于非常大的值,可以考虑将其拆分成多个小块进行存储。例如将一个大列表List拆分成多个较小的列表List存储。
(2)、使用压缩:对于文本或二进制数据,可以考虑使用压缩算法(如Gzip、Snappy)来减少值的大小。
(3)、使用外部存储:对于不适合存储在Redis中的大数据,可以考虑将其存储在其他专门的存储系统中(如Amazon S3、HDFS),并在Redis中只存储指向这些数据的引用(如URL或ID)。
(4)、使用流式处理:对于需要频繁读取或写入大值的场景,可以考虑使用Redis的流式处理功能(如XREAD和XADD),每次进读取部分数据,以避免一次性加载整个大值。

4、其他建议

(1)、优化数据结构:选择合适的数据结构来存储数据。例如,使用ZSET(有序集合)而不是HASH(哈希表)来存储带有权重的数据,或者使用LIST(列表)而不是SET(集合)来存储有序的元素。
(2)期清理过期数据:使用Redis的过期机制(EXPIRE、TTL)定期清理不再需要的大键或大值,避免长期占用内存。

5、如何检测大Key

(1)、使用MEMORY USAGE命令
可以使用MEMORY USAGE命令来检查某个键占用的内存大小。
例如:

MEMORY USAGE my_large_key

在这里插入图片描述
解释一下:
如上的示例可以看到键aaa1使用的内存大小是57字节。
我们从下面一行命令可以看到aaa1的键存储的值是zhangsan1,那么为什么Redis会分配57个字节呢?
答案:
因为Redis会为每一个key和value都创建一个对象头以记录key或value的类型,编码方式等附属信息;此外Redis的内存分配器jemalloc会分配比实际长度更大的空间保存数据,确保内存对齐和减少磁盘碎片;在加上各种底层数据结构不同也会占用一定的内存空间等,所以实际分配内存会比预想的大一些。
详细可以参考之前的Redis数据结构架构篇看下。

(2)、使用SCAN命令结合MEMORY USAGE
如果你不确定哪些键是大键,可以结合SCAN和MEMORY USAGE来批量检测。例如,编写一个脚本遍历所有键,并检查每个键的内存占用情况。
scan使用示例:
在这里插入图片描述

(3)、用Redis自带的监控工具
Redis提供了INFO memory命令,可以查看当前Redis实例的内存使用情况。你还可以使用Redis的慢查询日志(SLOWLOG)来检测哪些命令在处理大键时花费了较多时间。
命令示例:
在这里插入图片描述
说明:
used_memory:Redis分配的总内存量(以字节为单位)。
used_memory_human:used_memory转可读方式大小,方便阅读(如转KB、MB、GB)

(4)、使用第三方监控工具
一些第三方监控工具(如Redis Desktop Manager、RedisInsight、Prometheus + Grafana)可以帮助你实时监控Redis的内存使用情况,并识别出大键。

6、大Key总结

  • 大Key的定义:Redis中的"大 Key"既可以指键(Key)非常大,也可以指值(Value)非常大。无论是键还是值,过大的大小都会对Redis的性能和内存使用产生负面影响。通常在使用Redis过程中,不会存在过大的key,但是值却不好说,所以判断一个键是否为bigKey主要还是看它的值的大小。

  • 键非常大的影响:键过长会增加内存占用、降低性能,并增加网络传输开销。

  • 值非常大的影响:值过大会占用更多内存,导致阻塞操作、增加网络传输开销,并给备份和持久化带来压力。

  • 如何避免大Key:通过使用简短的键名、分片存储、压缩数据、使用外部存储等方式,可以有效避免大Key对Redis性能的影响。

  • 如何检测大Key:使用MEMORY USAGE、SCAN、INFO memory等命令或工具来检测和处理大 Key。

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

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

相关文章

02、并发编程的三大特性

并发编程有三大特性分别是,原子性,可见性,有序性。会产生这些特性的根本原因是现在的服务器都是多CPU多核心数的,每个CPU都有自己单独的一套缓存和pc系统,而且程序在运行时按照JMM的规范,它们是需要先把数据…

基于Java+Jsp Servlet Mysql实现的Java Web在线商城项目系统设计与实现

一、前言介绍: 1.1 项目摘要 随着互联网技术的飞速发展,电子商务已成为现代商业活动的重要组成部分。在线商城作为电子商务的一种重要形式,以其便捷性、高效性和广泛覆盖性,受到了越来越多消费者的青睐。同时,随着消…

【安全测试相关知识】

安全测试介绍 背景 在当前信息技术快速发展的背景下,网络安全问题日益严峻,数据泄露、黑客攻击、病毒传播等安全事件层出不穷,给个人、企业乃至国家带来严重威胁。所以安全测试已成为企业和国家关注的重心 作用 安全测试是确保软件系统安…

WPS如何快速将数字金额批量转换成中文大写金额,其实非常简单

大家好,我是小鱼。 在日常的工作中经常会遇到需要使用金额大写的情况,比如说签订业务合同时一般都会标注大写金额,这样是为了安全和防止串改。但是很多人也许不太熟悉金额大写的方法和习惯,其它没有关系,我们在用WPS制…

Element-ui的使用教程 基于HBuilder X

文章目录 1.Element-ui简介2.使用HBuilderX 创建一个基于Vue3的项目 (由于是使用的基于Vue3的Element-ui)3.安装element-ui4.在项目里完全引用element-ui5.引用组件6.运行项目 1.Element-ui简介 Element,一套为开发者、设计师和产品经理准备…

MySQL的架构设计和设计模式

1. 数据库设计模式与范式 数据库设计模式是解决数据库设计中常见问题的一种思维方式,它提供了一套解决方案。以下是一些常见的数据库设计模式和范式: 实体-关系模型(Entity-Relationship Model):通过实体和实体之间的…

【MySQL】十三,关于MySQL的全文索引

MySQL的全文索引用于搜索文本中的关键字,类似于like查询。 演示 建表 CREATE TABLE demo (id INT(11) NOT NULL,name CHAR(30) NOT NULL,age INT(11) NOT NULL,info VARCHAR(255),primary key(id),fulltext index futxt_idx_info(info) );此表的默认存储引擎为In…

Aloudata 入选 IDC「GenAI+Data」中国市场代表厂商

近期,国际知名技术研究与咨询机构 IDC 发布了《GenAIData 市场趋势分析及最佳实践案例》报告,总结了当前主要市场特点和数据变化影响,并给出技术布局建议,以供市场参考。报告中还绘制了 GenAIData 发展趋势图,从市场需…

NCR+可变电荷块3——NCB/cell绘图1

文献method参考: 蛋白质序列数据从uniprot中获取 https://www.uniprot.org/uniprotkb/P46013/entry https://www.uniprot.org/uniprotkb/P06748/entry、 1,电荷分布计算: Charge distribution was calculated as the sum of the charges …

单片机锂电池电量电压检测

一、引言 (一)锂电池电量检测的重要性简述 在如今这个科技飞速发展的时代,众多电子设备都依赖锂电池来供电,像我们日常使用的智能手机、平板电脑、笔记本电脑,还有出行必备的电动自行车、电动汽车等等,锂…

支付宝订单码支付

1.订单码支付,首先下载官方网站提供的sdk包到你的项目中。 2.选择控制器复制官方文档的获取二维码相关的代码示例。打开sdk包中v2的index.php文件,这个才是你选择语言的具体代码。 3.引用里面所需要的类文件,文件下载到你的项目中后&#xf…

【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)

一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod , CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高,缺省时使用组件自身内容的宽高,比如充满父布…

VTK知识学习(27)- 图像基本操作(二)

1、图像类型转换 1)vtkImageCast 图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑,会将结果存储为float或double类型,但在图像显示时,一般要求图像为 unsigned char 类型,…

Go C编程 第6课 无人机 --- 计算旋转角

旋转的秘密---认识角度 rt、lt命令学习 goc电子课程 一、编程步骤 第一步 第二步 第三步 第四步 二、画“四轴无人机” (一)、画第一根机轴 (二)、画第二根机轴 (三)、画完整的无人机 三、画“多轴无人…

cursor保存更改操作技巧

1. 当我们在agent模式时,要求cursor更改代码时,cursor回答后,就已经更改了代码了,这时候就可以对程序进行编译和测试, 不一定先要点” accept“, 先测试如果没有问题再点“accept”,这样composer就会多一条…

graphRAG+llama3.2的MOOC课程资源问答系统

文章目录 参考代码地址anacondapycharmLLaMA 3传统ragGraphRAG初始化提示词微调 prompt tuning来创建更适应知识库的知识图谱使用语言模型(LLM)从每个文本块中提取实体、关系和声明。检索 query(本地搜索(Local Search&#xff09…

一键打断线(根据相交点打断)——CAD c# 二次开发

多条相交线根据交点一键打断,如下图: 部分代码如下: finally namespace IFoxDemo; public class Class1 {[CommandMethod("ddx")]public static void Demo(){//"ifox可以了".Print();Database db HostApplicationServices.Workin…

Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录 背景 分析 解决方案 背景 正常情况下,会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时,总会返回非json数据。这是什么问题呢? 分析 期望的完整响应数据如下: {"session": {"inp…

flask后端开发(1):第一个Flask项目

目录 一、Helloworddebug、host、port的配置 一、Helloword 一般是会创建两个文件夹和app.py app.py from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!if __name__ __main__:app.run()右键运行这个py文件,消息绑定…

OAuth 2.0

简介 OAuth 是一种开放标准的授权协议或框架,它提供了一种安全的方式,使第三方应用程序能够访问用户在其他服务上的受保护资源,而无需共享用户的凭证(如用户名和密码)。OAuth 的核心思想是通过“授权令牌”来代替直接…