域名

Redis中的BigKey问题:排查与解决思路

字号+作者:益华科技来源:IT科技类资讯2025-11-03 23:47:45我要评论(0)

摘要Redis是一款性能强劲的内存数据库,但是在使用过程中,我们可能会遇到Big Key问题,这个问题就是Redis中某个key的value过大,所以Big Key问题本质是Big Value问题,导

摘要

Redis是题排一款性能强劲的内存数据库,但是查解在使用过程中,我们可能会遇到Big Key问题,决思这个问题就是题排Redis中某个key的value过大,所以Big Key问题本质是查解Big Value问题,导致Redis的决思性能下降或者崩溃。本文将向大家介绍如何排查和解决这个问题。题排

Big Key问题介绍

在Redis中,查解每个key都有一个对应的决思value,如果某个key的题排value过大,就会导致Redis的查解性能下降或者崩溃,比玄学更玄学,决思因为Redis需要将大key全部加载到内存中,题排这会占用大量的查解内存空间,会降低Redis的决思响应速度,这个问题被称为Big Key问题。不要小看这个问题,它可是能让你的Redis瞬间变成“乌龟”,由于Redis单线程的特性,免费源码下载操作Big Key的通常比较耗时,也就意味着阻塞Redis可能性越大,这样会造成客户端阻塞或者引起故障切换,有可能导致“慢查询”。

一般而言,下面这两种情况被称为大 key:

String 类型的 key 对应的value超过 10 MB。list、set、hash、zset等集合类型,集合元素个数超过 5000个。

以上对 Big Key 的判断标准并不是唯一,只是一个大体的标准。在实际业务开发中,对 Big Key的判断是需要根据具体的使用场景做不同的判断。比如操作某个 key 导致请求响应时间变慢,那么这个 key 就可以判定成 Big Key。

在Redis中,大key通常是由以下几种原因导致的:

对象序列化后的大小过大存储大量数据的企商汇容器,如set、list等大型数据结构,如bitmap、hyperloglog等

如果不及时处理这些大key,它们会逐渐消耗Redis服务器的内存资源,最终导致Redis崩溃。

Big Key问题排查

当出现Redis性能急剧下降的情况时,很可能是由于存在大key导致的。在排除大key问题时,可以考虑采取以下几种方法:

1.使用BIGKEYS命令

Redis自带的 BIGKEYS 命令可以查询当前Redis中所有key的信息,对整个数据库中的键值对大小情况进行统计分析,比如说,统计每种数据类型的键值对个数以及平均大小。此外,这个命令执行后,会输出每种数据类型中最大的 bigkey 的信息,对于 String 类型来说,会输出最大 bigkey 的字节长度,对于集合类型来说,会输出最大 bigkey 的元素个数

BIGKEYS命令会扫描整个数据库,源码库这个命令本身会阻塞Redis,找出所有的大键,并将其以一个列表的形式返回给客户端。

命令格式如下:

复制$ redis-cli --bigkeys1.

返回示例如下:

复制# Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed). [00.00%] Biggest string found so far a with 3 bytes [05.14%] Biggest list found so far b with 100004 items [35.77%] Biggest string found so far c with 6 bytes [73.91%] Biggest hash found so far d with 3 fields -------- summary ------- Sampled 506 keys in the keyspace! Total key length in bytes is 3452 (avg len 6.82) Biggest string found c has 6 bytes Biggest list found b has 100004 items Biggest hash found d has 3 fields 504 strings with 1403 bytes (99.60% of keys, avg size 2.78) 1 lists with 100004 items (00.20% of keys, avg size 100004.00) 0 sets with 0 members (00.00% of keys, avg size 0.00) 1 hashs with 3 fields (00.20% of keys, avg size 3.00) 0 zsets with 0 members (00.00% of keys, avg size 0.00)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

需要注意的是,由于BIGKEYS命令需要扫描整个数据库,所以它可能会对Redis实例造成一定的负担。在执行这个命令之前,请确保您的Redis实例有足够的资源来处理它,建议在从节点执行。

2.Debug Object

如果我们找到了Big Key,就需要对其进行进一步的分析。我们可以使用命令debug object key查看某个key的详细信息,包括该key的value大小等。这时候你就可以“窥探”Redis的内部,看看到底是哪个key太大了。

Debug Object 命令是一个调试命令,当 key 存在时,返回有关信息。 当 key 不存在时,返回一个错误。

复制redis 127.0.0.1:6379> DEBUG OBJECT key Value at:0xb6838d20 refcount:1 encoding:raw serializedlength:9 lru:283790 lru_seconds_idle:150 redis 127.0.0.1:6379> DEBUG OBJECT key (error) ERR no such key1.2.3.4.5.

serializedlength表示key对应的value序列化之后的字节数

3.memory usage

在Redis4.0之前,只能通过DEBUG OBJECT命令估算key的内存使用(字段serializedlength),但DEBUG OBJECT命令是有误差的。

4.0版本及以上,我们可以使用memory usag命令。

memory usage命令使用非常简单,直接按memory usage key名字;如果当前key存在,则返回key的value实际使用内存估算值;如果key不存在,则返回nil。

复制127.0.0.1:6379> set k1 value1 OK 127.0.0.1:6379> memory usage k1 //这里k1 value占用57字节内存 (integer) 57 127.0.0.1:6379> memory usage aaa // aaa键不存在,返回nil. (nil)1.2.3.4.5.6.

对于除String类型之外的类型,memory usage命令采用抽样的方式,默认抽样5个元素,所以计算是近似值,我们也可以指定抽样的个数。

示例说明:生成一个100w个字段的hash键:hkey,每字段的value长度是从1~1024字节的随机值。

复制127.0.0.1:6379> hlen hkey // hkey有100w个字段,每个字段的value长度介于1~1024个字节 (integer) 1000000 127.0.0.1:6379> MEMORY usage hkey //默认SAMPLES为5,分析hkey键内存占用521588753字节 (integer) 521588753 127.0.0.1:6379> MEMORY usage hkey SAMPLES 1000 //指定SAMPLES为1000,分析hkey键内存占用617977753字节 (integer) 617977753 127.0.0.1:6379> MEMORY usage hkey SAMPLES 10000 //指定SAMPLES为10000,分析hkey键内存占用624950853字节 (integer) 6249508531.2.3.4.5.6.7.8.

要想获取key较精确的内存值,就指定更大抽样个数。但是抽样个数越大,占用cpu时间分片就越大。

4.redis-rdb-tools

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。可以把 rdb 快照文件生成 CSV 或 JSON 文件,也可以导入到 MySQL 生成报表来分析。

使用 PYPI 安装:

复制pip install rdbtools1.

生成内存快照:

复制rdb -c memory dump.rdb > memory.csv1.

在生成的 CSV 文件中有以下几列:

database key在Redis的dbtype key类型key key值size_in_bytes key的内存大小encoding value的存储编码形式num_elements key中的value的个数len_largest_element key中的value的长度

可以在MySQL中新建表然后导入进行分析,然后可以直接通过SQL语句进行查询分析。

复制CREATE TABLE `memory` ( `database` int(128) DEFAULT NULL, `type` varchar(128) DEFAULT NULL, `KEY` varchar(128), `size_in_bytes` bigint(20) DEFAULT NULL, `encoding` varchar(128) DEFAULT NULL, `num_elements` bigint(20) DEFAULT NULL, `len_largest_element` varchar(128) DEFAULT NULL, PRIMARY KEY (`KEY`) );1.2.3.4.5.6.7.8.9.10.

例子:查询内存占用最高的3个 key:

复制mysql> SELECT * FROM memory ORDER BY size_in_bytes DESC LIMIT 3; +----------+------+-----+---------------+-----------+--------------+---------------------+ | database | type | key | size_in_bytes | encoding | num_elements | len_largest_element | +----------+------+-----+---------------+-----------+--------------+---------------------+ | 0 | set | k1 | 624550 | hashtable | 50000 | 10 | | 0 | set | k2 | 420191 | hashtable | 46000 | 10 | | 0 | set | k3 | 325465 | hashtable | 38000 | 10 | +----------+------+-----+---------------+-----------+--------------+---------------------+ 3 rows in set (0.12 sec)1.2.3.4.5.6.7.8.9.

Big Key问题解决思路

当发现存在大key问题时,我们需要及时采取措施来解决这个问题。下面列出几种可行的解决思路:

1.分割大key

将Big Key拆分成多个小的key。这个方法比较简单,但是需要修改应用程序的代码。就像是把一个大蛋糕切成小蛋糕一样,有点费力,但是可以解决问题。

或者尝试将Big Key转换成Redis的数据结构。例如,将Big Key转换成Hash,List或者Set等数据结构。

2.对象压缩

如果大key的大小主要是由于对象序列化后的体积过大,我们可以考虑使用压缩算法来减小对象的大小。Redis自身支持多种压缩算法,例如LZF、Snappy等。

3.直接删除

如果你使用的是Redis 4.0+的版本,可以直接使用 unlink命令去异步删除。4.0以下的版本 可以考虑使用 scan ,分批次删除。

无论采用哪种方法,都需要注意以下几点:

避免使用过大的value。如果需要存储大量的数据,可以将其拆分成多个小的value。就像是吃饭一样,一口一口的吃,不要贪多嚼不烂。避免使用不必要的数据结构。例如,如果只需要存储一个字符串,就不要使用Hash或者List等数据结构。定期清理过期的key。如果Redis中存在大量的过期key,就会导致Redis的性能下降。就像是家里的垃圾,需要定期清理。对象压缩

总结

Big Key问题是Redis中常见的问题之一,但是通过合理的排查和解决思路,我们可以有效地避免这个问题。在使用Redis时,需要注意避免使用过大的value和不必要的数据结构,以及定期清理过期的key。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 网吧电脑脱离主机教程(轻松拆解,自由组装,享受自由游戏体验)

    网吧电脑脱离主机教程(轻松拆解,自由组装,享受自由游戏体验)

    2025-11-03 22:20

  • 惠普电脑触屏使用教程(轻松掌握惠普电脑触屏操作技巧)

    惠普电脑触屏使用教程(轻松掌握惠普电脑触屏操作技巧)

    2025-11-03 21:52

  • 电脑分区调整检测错误全解析(深入剖析电脑分区调整中的常见错误及解决方案)

    电脑分区调整检测错误全解析(深入剖析电脑分区调整中的常见错误及解决方案)

    2025-11-03 21:39

  • inux/Ubuntu系统用的时间久了,经常会有一些系统更新,除了一些系统补丁、工具补丁、工具升级之外,内核也经常对一些问题进行修改升级,这样就会产生一些新的内核,我们更新了新的内核后,就会自动帮我们添加到开机启动菜单选项中,那些旧的内核启动项,对于我们来说已经没有用了,可以删除,删除后可以让我们在开机的时候能快速的选择要启动的菜单项,同时也能清理出一些磁盘空间出来,小编下面就来分享如何删除多余的内核启动菜单项注意:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面  1、打开“应用程序”,然后在弹出菜单中点击“附件”,选择并打开“终端”,打开终端命令窗口2、在终端命令窗口中输入并执行下面的命令:uname -a,查看我们当前使用的内核,不要删除错误了,或者当我们使用的是旧内核进入系统,想删除这个内核启动项,这样也是不能删除的。只能在开机时选择别的内核启动项进入系统才能删除3、输入下面的命令,查看当前我们系统中有哪些内核启动项,同时也可以方便我们复制的操作,具体命令是:dpkg --get-selections | grep linux4、下面就开始删除内核启动项,先选择内核启动项,然后复制,这样方便操作,然后输入下面的命令:sudo apt-get remove linux-image-2.6.32.21-generic5、执行过程中会警告我们确实要执行这个操作,输入字母y,然后回车,就开始卸载旧内核了6、之后就是一些具体的卸载过程的提示,已经更新系统启动项的信息7、我们再次使用命令:dpkg --get-selections | grep linux 来查看当前的内核情况:在 linux-image-2.6.32.21-generic 后面显示deinstall,表示已经卸载了linux-headers-2.6.32.21和 linux-headers-2.6.32.21-generic是之前我们卸载的内核相关联的头文件,现在对于我们也没有用,也可以卸载了,卸载了可以帮我们清理出不少磁盘空间,具体命令是:sudo apt-get remove linux-headers-2.6.32-21sudo apt-get remove linux-headers-2.6.32-21-generic8、删除完后,再用命令:dpkg --get-selections | grep linux 查看当前内核启动选项相关信息:linux-headers-2.6.32-21 已经没有了,被删除了linux-headers-2.6.32-21-generic已经没有了,被删除了linux-image-2.6.32-21-generic 显示为deinstall,表示被卸载删除了9、 虽然在卸载旧内核的时候提示信息说已经帮我们更新了系统启动项,但为了保险起见我们执行sudo update-grub更新开机启动控制文件。

    inux/Ubuntu系统用的时间久了,经常会有一些系统更新,除了一些系统补丁、工具补丁、工具升级之外,内核也经常对一些问题进行修改升级,这样就会产生一些新的内核,我们更新了新的内核后,就会自动帮我们添加到开机启动菜单选项中,那些旧的内核启动项,对于我们来说已经没有用了,可以删除,删除后可以让我们在开机的时候能快速的选择要启动的菜单项,同时也能清理出一些磁盘空间出来,小编下面就来分享如何删除多余的内核启动菜单项注意:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面  1、打开“应用程序”,然后在弹出菜单中点击“附件”,选择并打开“终端”,打开终端命令窗口2、在终端命令窗口中输入并执行下面的命令:uname -a,查看我们当前使用的内核,不要删除错误了,或者当我们使用的是旧内核进入系统,想删除这个内核启动项,这样也是不能删除的。只能在开机时选择别的内核启动项进入系统才能删除3、输入下面的命令,查看当前我们系统中有哪些内核启动项,同时也可以方便我们复制的操作,具体命令是:dpkg --get-selections | grep linux4、下面就开始删除内核启动项,先选择内核启动项,然后复制,这样方便操作,然后输入下面的命令:sudo apt-get remove linux-image-2.6.32.21-generic5、执行过程中会警告我们确实要执行这个操作,输入字母y,然后回车,就开始卸载旧内核了6、之后就是一些具体的卸载过程的提示,已经更新系统启动项的信息7、我们再次使用命令:dpkg --get-selections | grep linux 来查看当前的内核情况:在 linux-image-2.6.32.21-generic 后面显示deinstall,表示已经卸载了linux-headers-2.6.32.21和 linux-headers-2.6.32.21-generic是之前我们卸载的内核相关联的头文件,现在对于我们也没有用,也可以卸载了,卸载了可以帮我们清理出不少磁盘空间,具体命令是:sudo apt-get remove linux-headers-2.6.32-21sudo apt-get remove linux-headers-2.6.32-21-generic8、删除完后,再用命令:dpkg --get-selections | grep linux 查看当前内核启动选项相关信息:linux-headers-2.6.32-21 已经没有了,被删除了linux-headers-2.6.32-21-generic已经没有了,被删除了linux-image-2.6.32-21-generic 显示为deinstall,表示被卸载删除了9、 虽然在卸载旧内核的时候提示信息说已经帮我们更新了系统启动项,但为了保险起见我们执行sudo update-grub更新开机启动控制文件。

    2025-11-03 21:23

网友点评
精彩导读
本文向大家介绍一些我在 Ubuntu 15.10 安装之后所做的几项配置。1.了解新功能特性Ubuntu 15.10 Wily Werewolf 虽然不是一个颠覆性的功能更新版本,但还是带来了不少的功能特性和用户体验改进,之前的 Ubuntu 15.10 新特性文章 中已经有过介绍,这里不再赘述。2.更新系统虽然是才发布的最新 Ubuntu 15.10 版本,但在安装好之后还是有些系统更新和软件更新需要进行的,这在 Linux 世界不足为奇。我们可以在软件更新器中直接点击立即安装进行更新。3.安装Linux显卡驱动要获得 Ubuntu 更好的显示性能就必需安装好适配的显卡驱动程序,以让 Ubuntu 桌面能够平稳运行,在安装好 Linux 显卡驱动后也可以让你在游戏和多媒体应用中获得最佳的帧速率。Ubuntu 目前已支持大多数图形硬件的开源驱动,要为 Ubuntu 15.10 安装驱动程序可以在软件和更新—附加驱动中进行安装。4.安装媒体编解码器受限于法律限制 Ubuntu 无法直接集成 MP3 等流行的媒体编解码器以让用户开箱即用,不过这个问题很好解决,我们可以直接在 Ubuntu 软件中心中搜索 Ubuntu restricted extras 进行安装。5.调整菜单当我们在 Ubuntu 15.10 中打开应用或窗口之后,默认在顶部都会显示菜单(几秒)之后便会自动隐藏,当我们将鼠标焦点再移到顶部栏时菜单才会再次出现。该功能可以节省显示空间,以减少对用户的操作干扰。假如你不喜欢此功能,可以在系统设置—外观—中调整到在窗口的标题栏,将菜单栏调整到应用窗口显示,而不在顶部栏显示。6.处理Flash问题虽然互联网上掀起了抛弃 Flash 的浪潮,但还是有些网站需要使用到 Flash 的。但 Adobe 早在几年前便宣布了停止对 Linux 的 Flash 支持,许多浏览器都宣布要放弃 NPAPI 架构。目前来说,我比较推荐大家使用 Google Chrome 浏览器,因为其最新版本可以很好的处理 Flash 插件问题。7.换一个好看的皮肤由于 Ubuntu 几年来的默认主题都没太大变化,给人的感觉总是没太多变化和新意,这让我们的 Ubuntu 显示比较单调。因此,在装好 Ubuntu 15.10 之后换一个好看点的主题也是一项比较建议的操作。假如你只想更改 Ubuntu 15.10 桌面背景的话,可以到系统设置—外观中进行更改。8.管理隐私当我们在 Unity Dash 中搜索文件时,总会出现应用程序、在线结果和重要文件的相关数据。假如不希望包含个人信息的数据出现在搜索结果中,我们可以选择将其关闭。在系统设置—安全和隐私的文件和应用选择卡中选择关闭并去掉要禁止搜索结果中显示的数据类型即可。假如不想在 Unity Dash 显示在线搜索结果,只需在搜索选项卡中禁用在线搜索结果即可。9.安装所需的应用Ubuntu 15.10 虽然为我们内置了大名鼎鼎的 LibreOffice 和 Firefox 等应用,但这些应用也许不是你最钟爱和常用的。Ubuntu 软件中心为我们提供了数量众多的免费应用,其中就包括:◆Steam – 游戏分销平台◆GIMP – 好用的图像编辑器◆VLC – 国际上非常流行的媒体播放器◆Geary – 桌面电子邮件客户端◆Chromium – 来自 Google 的开源 Web 浏览器◆Skype – 这个不用我介绍吧当然,我个人比较推荐的一些软件如下(不包括在Ubuntu 软件中心):◆Google Chrome – 这个不用介绍◆Spotify for Linux – Linux 下流行的流媒体音乐服务◆Corebird – Linux 桌面 Twitter 客户端◆Lightwork – 业非线视频编辑器◆Viber – Skype的替代方案◆Vivaldi – 面向开发人员的 Web 浏览器10.安装搜狗输入法由 Ubuntu Kylin 团队与搜狗公司联合开发的搜狗Linux 输入法2.0 版本版于 2015 年10 月16 日正式发布,具有支持双拼、智能拼音、自动匹配、多样化皮肤支持等功能。以上就是Ubuntu 15.10安装之后需要做的十件事,希望对大家的学习有所帮助。

本文向大家介绍一些我在 Ubuntu 15.10 安装之后所做的几项配置。1.了解新功能特性Ubuntu 15.10 Wily Werewolf 虽然不是一个颠覆性的功能更新版本,但还是带来了不少的功能特性和用户体验改进,之前的 Ubuntu 15.10 新特性文章 中已经有过介绍,这里不再赘述。2.更新系统虽然是才发布的最新 Ubuntu 15.10 版本,但在安装好之后还是有些系统更新和软件更新需要进行的,这在 Linux 世界不足为奇。我们可以在软件更新器中直接点击立即安装进行更新。3.安装Linux显卡驱动要获得 Ubuntu 更好的显示性能就必需安装好适配的显卡驱动程序,以让 Ubuntu 桌面能够平稳运行,在安装好 Linux 显卡驱动后也可以让你在游戏和多媒体应用中获得最佳的帧速率。Ubuntu 目前已支持大多数图形硬件的开源驱动,要为 Ubuntu 15.10 安装驱动程序可以在软件和更新—附加驱动中进行安装。4.安装媒体编解码器受限于法律限制 Ubuntu 无法直接集成 MP3 等流行的媒体编解码器以让用户开箱即用,不过这个问题很好解决,我们可以直接在 Ubuntu 软件中心中搜索 Ubuntu restricted extras 进行安装。5.调整菜单当我们在 Ubuntu 15.10 中打开应用或窗口之后,默认在顶部都会显示菜单(几秒)之后便会自动隐藏,当我们将鼠标焦点再移到顶部栏时菜单才会再次出现。该功能可以节省显示空间,以减少对用户的操作干扰。假如你不喜欢此功能,可以在系统设置—外观—中调整到在窗口的标题栏,将菜单栏调整到应用窗口显示,而不在顶部栏显示。6.处理Flash问题虽然互联网上掀起了抛弃 Flash 的浪潮,但还是有些网站需要使用到 Flash 的。但 Adobe 早在几年前便宣布了停止对 Linux 的 Flash 支持,许多浏览器都宣布要放弃 NPAPI 架构。目前来说,我比较推荐大家使用 Google Chrome 浏览器,因为其最新版本可以很好的处理 Flash 插件问题。7.换一个好看的皮肤由于 Ubuntu 几年来的默认主题都没太大变化,给人的感觉总是没太多变化和新意,这让我们的 Ubuntu 显示比较单调。因此,在装好 Ubuntu 15.10 之后换一个好看点的主题也是一项比较建议的操作。假如你只想更改 Ubuntu 15.10 桌面背景的话,可以到系统设置—外观中进行更改。8.管理隐私当我们在 Unity Dash 中搜索文件时,总会出现应用程序、在线结果和重要文件的相关数据。假如不希望包含个人信息的数据出现在搜索结果中,我们可以选择将其关闭。在系统设置—安全和隐私的文件和应用选择卡中选择关闭并去掉要禁止搜索结果中显示的数据类型即可。假如不想在 Unity Dash 显示在线搜索结果,只需在搜索选项卡中禁用在线搜索结果即可。9.安装所需的应用Ubuntu 15.10 虽然为我们内置了大名鼎鼎的 LibreOffice 和 Firefox 等应用,但这些应用也许不是你最钟爱和常用的。Ubuntu 软件中心为我们提供了数量众多的免费应用,其中就包括:◆Steam – 游戏分销平台◆GIMP – 好用的图像编辑器◆VLC – 国际上非常流行的媒体播放器◆Geary – 桌面电子邮件客户端◆Chromium – 来自 Google 的开源 Web 浏览器◆Skype – 这个不用我介绍吧当然,我个人比较推荐的一些软件如下(不包括在Ubuntu 软件中心):◆Google Chrome – 这个不用介绍◆Spotify for Linux – Linux 下流行的流媒体音乐服务◆Corebird – Linux 桌面 Twitter 客户端◆Lightwork – 业非线视频编辑器◆Viber – Skype的替代方案◆Vivaldi – 面向开发人员的 Web 浏览器10.安装搜狗输入法由 Ubuntu Kylin 团队与搜狗公司联合开发的搜狗Linux 输入法2.0 版本版于 2015 年10 月16 日正式发布,具有支持双拼、智能拼音、自动匹配、多样化皮肤支持等功能。以上就是Ubuntu 15.10安装之后需要做的十件事,希望对大家的学习有所帮助。

热门资讯