一、bigKeys

bigKeys是 redis-cli 自带的命令选项,可以对整个Redis实例进行扫描,找出较大的Key。

使用示例

$ redis-cli --bigkeys
<h1 id="Scanning the entire keyspace to find biggest keys as well as">Scanning the entire keyspace to find biggest keys as well as</h1><h1 id="average sizes per key type.  You can use -i 0.01 to sleep 0.01 sec">average sizes per key type.  You can use -i 0.01 to sleep 0.01 sec</h1><h1 id="per SCAN command (not usually needed).">per SCAN command (not usually needed).</h1>
<p>[00.00%] Biggest string found so far 'key-419' with 3 bytes
[05.14%] Biggest list   found so far 'mylist' with 100004 items
[35.77%] Biggest string found so far 'counter:<strong>rand_int</strong>' with 6 bytes
[73.91%] Biggest hash   found so far 'myobject' with 3 fields</p>
<p>-------- summary -------</p>
<p>Sampled 506 keys in the keyspace!
Total key length in bytes is 3452 (avg len 6.82)</p>
<p>Biggest string found 'counter:<strong>rand_int</strong>' has 6 bytes
Biggest   list found 'mylist' has 100004 items
Biggest   hash found 'myobject' has 3 fields</p>
<p>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. 该命令使用scan方式对key进行统计,所以使用时无需担心对redis造成阻塞。

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

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

更多关于bigKeys的说明可以参考这里

二、Redis Debug Object

Redis Debug Object 命令是一个调试命令,它不应被客户端所使用。

基本语法:

127.0.0.1:6379> DEBUG OBJECT key

使用示例

127.0.0.1:6379> DEBUG OBJECT my_pc
Value at:0xb6838d20 refcount:1 encoding:raw serializedlength:9 lru:283790 lru_seconds_idle:150</p>
<p>127.0.0.1:6379> DEBUG OBJECT your_mac
(error) ERR no such key

关于输出的项的说明:

  • Value at:key的内存地址

  • refcount:引用次数

  • encoding:编码类型

  • serializedlength:序列化长度

  • lru_seconds_idle:空闲时间 关于refcount, encoding, lru_seconds_idle的更详细解释可以参考这里

三、Redis RDB Tools

Rdbtools 是 Redis 的 dump.rdb 文件的解析器。解析器生成类似于 xml sax 解析器的事件,并且在内存方面非常有效。

此外,rdbtools 提供实用程序:

  1. 跨所有数据库和键生成数据的内存报告

  2. 将转储文件转换为 JSON

  3. 使用标准差异工具比较两个转储文件

安装 rdbtools

先决条件:

  1. python-lzf 是可选的,但强烈建议加快解析速度。

  2. redis-py 是可选的,只需要运行测试用例。

  • 通过PyPI安装(推荐):

pip install rdbtools python-lzf
  • 通过源码安装:

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

使用示例

生成内存报告

使用 -c memory 选项生成一个 CSV 报告, 其中包含该键使用的大致内存。--bytes C--largest N 可用于将输出限制为大于 C 字节的键或 N 个最大的键。

$ rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
$ cat memory.csv</p>
<p>database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11

生成的 CSV 具有以下列 - 生成的 CSV 具有以下列 - 数据库编号、数据类型、Key、以字节为单位的内存和 RDB 编码类型。内存使用包括键、值和任何其他开销。

请注意,内存使用量是近似值。一般来说,实际使用的内存会略高于报告的内存。

您可以根据 key 或 数据库编号 或 数据类型 过滤报告。

查找单个Key使用的内存

有时只想查找特定 Key 使用的内存,而在转储文件上运行整个内存报告非常耗时。在这种情况下,可以使用 redis-memory-for-key 命令:

$ redis-memory-for-key person:1</p>
<p>$ redis-memory-for-key -s localhost -p 6379 -a mypassword person:1</p>
<p>Key 			person:1
Bytes				111
Type				hash
Encoding			ziplist
Number of Elements		2
Length of Largest Element	8