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。

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

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

相关文章

ModbusTCP从站转Profinet主站案例

一. 案例背景 在复杂的工业自动化场景中,企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能,在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&…

微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择

Area 省市区选择,省市区选择组件通常与 弹出层 组件配合使用。 areaList 格式 areaList 为对象结构,包含 province_list、city_list、county_list 三个 key。 每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两…

智驾感知「大破局」!新一轮混战开启

随着智能驾驶搭载率的攀升,舱外传感器赛道迎来新变局。 一方面,从近几年智驾传感器的配置变化来看,摄像头的主导地位显而易见。 12月10-12日,由德赛西威总冠名的2024(第八届)高工智能汽车年会暨年度金球奖…

Kibana8.17.0在mac上的安装

1、Kibana是什么 Kibana是与elasticsearch配套使用的数据分析与可视化工具,通过Kibana可以轻松与es中存储的数据进行高效的交互,包括数据写入、检索、删除等操作,并可以通过编写部分代码将数据做成各种报表,从而进行非常直观的统…

数字IC后端设计实现十大精华主题分享

今天小编给大家分享下吾爱IC社区星球上周十大后端精华主题。 Q1:星主,请教个问题,长tree的时候发现这个scan的tree 的skew差不多400p,我高亮了整个tree的schematic,我在想是不是我在这一系列mux前边打断,设置ignore p…

给bmp和png,设置BLENDFUNCTION的AlphaFormat不同参数的效果

BLENDFUNCTION是AlphaBlend用控制透明效果的重要参数。 选择一个32位的png图片,设置AlphaFormat 为 AC_SRC_ALPHA,效果如上图。 选择一个32位的png图片,设置AlphaFormat 为 0,效果如上图。 选择一个24位的bmp图片,设置…

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日,由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛,包括上海幸运星足球俱乐部旗下的明星球队,以及其他青少年俱乐部的优秀队伍&…

MTK--mt7921 usb wifi debug

文章目录 1、代码编译2、配置文件修改3、Wifi设置命令4、Wifi debug 淘宝随便买个7921的usb wifi。 1、代码编译 export TEMPLATECONF${PWD}/meta/meta-mediatek-mt8518/conf/base/aud8518sp2-slc-32b-7921-c4a-user source meta/poky/oe-init-build-env bitbake mtk-image-au…

如何配置OSB连接数据连接/读取超时

1.Oracle DB OSB中的DBAdapter的查询超时参数配置没用,要解决接口超时问题,需要在console中的数据源配置超时参数: oracle.net.CONNECT_TIMEOUT30000 oracle.net.READ_TIMEOUT30000 添加图片注释,不超过 140 字(可选…

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…

Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息

目录 Python正则表达式re库的基本用法 引入re库 各函数功能 总结 使用方法举例 正则表达式语法与书写方式 正则表达式的常用操作符 思科ASA防火墙数据 数据1 数据2 书写正则表达式 Python中pydantic的使用 导入基础数据模板 根据数据采集目标定义Pydantic数据类型…

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串?2、两个引号之间加上空格 好的,我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别,以及它们在 SQL 查询中的作用: 1. we_chat_union_id IS NOT NULL 含…

如何利用AWS监听存储桶并上传到tg bot

业务描述: 需要监听aws的存储中的最新消息,发送新的消息推送到指定tg的频道。 主要流程: 1.上传消息到s3存储桶(不做具体描述) 2.通过aws的lambda监听s3存储桶的最新消息(txt文件) 3.将txt文件…

HarmonyOS NEXT 实战之元服务:静态案例效果---查看国内航班服务

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: Index代码 import { authen…

Windows11家庭版启动Hyper-V

Hyper-V 是微软的硬件虚拟化产品,允许在 Windows 上以虚拟机形式运行多个操作系统。每个虚拟机都在虚拟硬件上运行,可以创建虚拟硬盘驱动器、虚拟交换机等虚拟设备。使用虚拟化可以运行需要较旧版本的 Windows 或非 Windows 操作系统的软件,以…

为什么深度学习和神经网络要使用 GPU?

为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…

图像处理-Ch7-快速小波变换和小波包

个人博客!无广告观看,因为这节内容太多了,有点放不下,分了三节 文章目录 快速小波变换(The Fast Wavelet Transform)与两频段子带编译码系统的关系例:计算一维小波变换 一维快速小波反变换例:计算一维小波…

[项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结

目录 编写http_server模块 1. 引入cpp-httplib到项目中 2. cpp-httplib的使用介绍 3. 正式编写http_server 九、添加日志到项目中 十、编写前端模块 十一. 详解传 gitee 十二、项目总结 项目的扩展 写在前面 [项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 |…

xxl-job 简单的入门到实战

本文是参考官方文档自己实践一次,纯享版,大致也是作者边写博客边去跟着官方文档实现 一、前期准备 1、官网地址 GitHub地址: GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB&…

【教程】通过Docker运行AnythingLLM

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…