如何发现 Redis 内存占用大 key

共 2922字,需浏览 6分钟

 ·

2021-09-10 14:00

Redis 中的大 key 一直是重点需要优化的对象,big key 既占用比较多的内存,也可能占用比较多的网卡资源,造成 Redis 阻塞,因此需要找到这些 big key 进行优化。


0x01:redis-rdb-tools工具

在 redis 实例上执行 bgsave,然后对 dump 出来的 rdb文件进行分析,找到其中的大 key。

https://github.com/sripathikrishnan/redis-rdb-tools

rdbtools 工 具包括了3个可执行文件:

  • rdb 解析整个rdb文件

  • redis-memory-for-key 解析server里的单个key

  • redis-profiler  解析rdb文件成html格式

源码安装redis-rdb-tools

git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
python setup.py install


安装 python-lzf,加快解析速度

pip install python-lzf

推荐 PyPI 安装方式

pip install rdbtools python-lzf


0x02:redis-cli --bigkeys 命令

可以找到某个实例5种数据类型 String、hash、list、set、zset 的最大key

[redis@olive bin]$ ./redis-cli -h 127.0.0.1 -p 6379 --bigkeys

# 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 'artisan43206' with 12 bytes
[37.40%] Biggest string found so far 'artisanBIG' with 26890 bytes

-------- summary -------

Sampled 100004 keys in the keyspace!
Total key length in bytes is 1188921 (avg len 11.89)

Biggest string found 'artisanBIG' has 26890 bytes

100004 strings with 1215805 bytes (100.00of keys, avg size 12.16)
0 lists with 0 items (00.00of keys, avg size 0.00)
0 sets with 0 members (00.00of keys, avg size 0.00)
0 hashs with 0 fields (00.00of keys, avg size 0.00)
0 zsets with 0 members (00.00of keys, avg size 0.00)
0 streams with 0 entries (00.00of keys, avg size 0.00)
[redis@olive bin]$ 
  • 该命令使用 scan 方式对 key 进行统计,所以使用时无需担心对 redis 造成阻塞。

  • 输出大概分为两部分,summary 之上的部分,只是显示了扫描的过程。summary 部分给出了每种数据结构中最大的Key。

  • 统计出的最大 key 只有 string 类型是以字节长度为衡量标准的。list、set、zset 等都是以元素个数作为衡量标准,不能说明其占的内存就一定多。所以,如果存储的Key 主要以 string 类型存在,这种方法就比较适合。


0x03:自定义扫描脚本

以 Python 脚本居多,使用方式与 redis-cli --bigkeys类似。


0x04:debug object key 命令

可以查看某个 key 序列化后的长度,每次只能查找单个 key 的信息。不推荐使用该方式。


0x05:memory usage 命令


Redis 4.0 引入了 memory usage 命令和 lazyfree 机制。不管是对 big key 的发现,还是解决 big key 删除或者过期造成的阻塞问题都有明显的提升。

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

喜欢,在看

浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报