需要注意的是,由于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 keyValue at:0xb6838d20 refcount:1 encoding:raw serializedlength:9 lru:283790 lru_seconds_idle:150redis 127.0.0.1:6379> DEBUG OBJECT key(error) ERR no such key
第一次运行命令时 , 返回了 key 对应的具体信息 。这些值的意思如下:- Value at:0xb6838d20:key 所在的内存地址 。
- refcount:1:引用计数,表示该对象被引用的次数 。
- encoding:raw:编码类型,这里是 raw ,表示这个字符串对象的编码类型 。
- serializedlength:9:序列化后的长度 。
- lru:283790:LRU (Least Recently Used)信息,即最近最少使用算法的相关信息,在内存淘汰策略中会用到 。
- lru_seconds_idle:150:该 key 已空闲多久(单位为秒),也就是自从最后一次访问已经过去多少秒 。
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 value1OK127.0.0.1:6379> memory usage k1//这里k1 value占用57字节内存(integer) 57127.0.0.1:6379> memory usage aaa// aaa键不存在,返回nil.(nil)
对于除String类型之外的类型,memory usage命令采用抽样的方式 , 默认抽样5个元素,所以计算是近似值,我们也可以手动指定抽样的个数 。示例说明:生成一个100w个字段的hash键:hkey,每字段的value长度是从1~1024字节的随机值 。
127.0.0.1:6379> hlen hkey// hkey有100w个字段,每个字段的value长度介于1~1024个字节(integer) 1000000127.0.0.1:6379> MEMORY usage hkey//默认SAMPLES为5,分析hkey键内存占用521588753字节(integer) 521588753127.0.0.1:6379> MEMORY usage hkey SAMPLES1000 //指定SAMPLES为1000,分析hkey键内存占用617977753字节(integer) 617977753127.0.0.1:6379> MEMORY usage hkey SAMPLES10000 //指定SAMPLES为10000,分析hkey键内存占用624950853字节(integer) 624950853
要想获取key较精确的内存值,就指定更大抽样个数 。但是抽样个数越大,占用cpu时间分片就越大 。4.redis-rdb-toolsredis-rdb-tools 是一个 Python/ target=_blank class=infotextkey>Python 的解析 rdb 文件的工具,在分析内存的时候 , 我们主要用它生成内存快照 。可以把 rdb 快照文件生成 CSV 或 JSON 文件 , 也可以导入到 MySQL 生成报表来分析 。
使用 PYPI 安装:
【Redis中的Big Key问题:排查与解决思路】
pip install rdbtools
生成内存快照:rdb -c memory dump.rdb > memory.csv
在生成的 CSV 文件中主要有以下几列:- database key在Redis的db
- type key类型
- key key值
- size_in_bytes key的内存大小
- encoding value的存储编码形式
推荐阅读
- 电表中的感应线圈起什么作用
- 谭咏麟照片中的茅台酒引发热议,网友纷纷揣测价值与珍贵程度
- 宫保鸡丁中的宫保是什么含义 宫保鸡丁的宫保是什么意思是人名还是官名
- 家庭中的礼仪 家庭中的礼仪寄语
- 销售话术中的四种技巧是什么
- 因太漂亮被导演收入囊中的4位女星!有一位戏还没拍完戏就怀孕了
- 苹果怎么把视频声音做成铃声 怎么提取视频中的音乐做手机铃声
- 生活中的基本礼仪有哪些 生活中的基本礼仪
- 宋轶在节目中的一句话,得罪了大半个娱乐圈的当红小花们
- 你真的理解Python Qt6基础知识中的信号和槽机制吗?