Redis中的Big Key问题:排查与解决思路( 二 )

  • 有1个列表键,包含100004个元素 , 占所有键的0.20%,平均每个列表键大小为100004个元素 。
  • 没有集合(set)键 。
  • 有1个哈希键,包含3个字段,占所有键的0.20%,平均每个哈希键大小为3个字段 。
  • 没有有序集合(zset)键 。
  • 这些信息可以帮助你理解Redis数据库的使用状态,以便进行相应的优化或调整 。
    需要注意的是,由于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 已空闲多久(单位为秒),也就是自从最后一次访问已经过去多少秒 。
    第二次运行命令时,返回了 (error) ERR no such key,说明在 Redis 中没有找到名为 '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 文件中主要有以下几列: