分析redis key的大小

一、bigKeys

这是redis-cli自带的一个命令。对整个redis进行扫描,寻找较大的key。例:

格式:redis-cli -h 服务端主机名或者IP地址 -p 端口 --bigkeys

$ redis-cli -h 192.168.0.112 -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 'tx:manager:compensate:order-service:2019-01-25:eXC0yl5s.json' with 69032 bytes
[00.00%] Biggest hash   found so far 'count' with 33 fields
[47.62%] Biggest set    found so far 'menu:url' with 8 members

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

Sampled 21 keys in the keyspace!
Total key length in bytes is 743 (avg len 35.38)

Biggest string found 'tx:manager:compensate:order-service:2019-01-25:eXC0yl5s.json' has 69032 bytes
Biggest    set found 'menu:url' has 8 members
Biggest   hash found 'count' has 33 fields

14 strings with 274555 bytes (66.67% of keys, avg size 19611.07)
0 lists with 0 items (00.00% of keys, avg size 0.00)
1 sets with 8 members (04.76% of keys, avg size 8.00)
6 hashs with 39 fields (28.57% of keys, avg size 6.50)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

说明:
①该命令使用scan方式对key进行统计,所以使用时无需担心对redis造成阻塞。
②输出大概分为两部分,summary之上的部分,只是显示了扫描的过程。summary部分给出了每种数据结构中最大的Key。
③统计出的最大key只有string类型是以字节长度为衡量标准的。list,set,zset等都是以元素个数作为衡量标准,不能说明其占的内存就一定多。所以,如果你的Key主要以string类型存在,这种方法就比较适合。
④更多请参考:https://redis.io/topics/rediscli#scanning-for-big-keys

二、debug object key

redis的命令,可以查看某个key序列化后的长度。

示例:
192.168.0.112:6379>hmset myhash k1 v1 k2 v2 k3 v3
OK
192.168.0.112:6379> debug object myhash
Value at:0x7f005c6920a0 refcount:1 encoding:ziplist serializedlength:36 lru:3341677 lru_seconds_idle:2

输出项说明:
Value at:key的内存地址
refcount:引用次数
encoding:编码类型
serializedlength:序列化长度
lru_seconds_idle:空闲时间

注意事项:
①serializedlength是key序列化后的长度(redis在将key保存为rdb文件时使用了该算法),并不是key在内存中的真正长度。这就像一个数组在json_encode后的长度与其在内存中的真正长度并不相同。不过,它侧面反应了一个key的长度,可以用于比较两个key的大小。
②serializedlength会对字串做一些可能的压缩。如果有些字串的压缩比特别高,那么在比较时会出现问题。如下所示:

192.168.0.112:6379>set str1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK

192.168.0.112:6379>set str2 abcdefghijklmnopqrstuvwxyz1234
OK

192.168.0.112:6379>debug object str1
Value at:0x7f007c035b80 refcount:1 encoding:embstr serializedlength:12 lru:3342615 lru_seconds_idle:13

192.168.0.112:6379>debug object str2
Value at:0x7f00654df400 refcount:1 encoding:embstr serializedlength:31 lru:3342622 lru_seconds_idle:7

两个字串的实际长度都是30, 但str1的serializedlength为12, str2的为31。

三、redis rdb tools

这是一个redis rdb file的分析工具,可以根据rdb file生成内存报告。

1、安装rdbtools工具

pip install rdbtools

2、生成内存报告
首先我们需要有一份rdb文件,如果你在配置中开启了rdb,那么redis会自动生成rdb文件。如果没有,可以手动执行bgsave。如果是线上机器,执行时要考虑机器负载等问题。拿到rdb文件后,我们就可以生成内存报告了。命令如下:

rdb -c memory rdb文件 

示例:
C:\Users\92403>rdb -c memory dump.rdb

在这里插入图片描述

输出了db,数据类型,key, 大小, 编码等多列信息。至于分析数据,你可以用shell,也可以保存成csv用excel排序,或者干脆存到db里,想怎么排怎么排。

如果只要知道最大的N个key, 可以使用 -l 选项。例:

C:\Users\92403>rdb -c memory -l 3 dump.rdb    #查询最大的3个key
WARNING: python-lzf package NOT detected. Parsing dump file will be very slow unless you install it. To install, run the following command:

pip install python-lzf

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
8,list,luck:draw:record:member:info:1,59361,quicklist,425,165,
8,list,assistance:award:member:1:181256,7836,quicklist,22,364,
8,list,assistance:award:member:1:252741,7873,quicklist,22,379,

3、查看单个key
如果我们只需要查询单个key所使用的内存可以不必依赖rdb file, 使用redis-memory-for-key命令即可。
例:

格式:redis-memory-for-key -s 服务端主机名或者IP地址 -p 端口 key

C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 myhash
Key                             myhash
Bytes                           83
Type                            hash
Encoding                        ziplist
Number of Elements              3
Length of Largest Element       2

C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 str1
Key                             str1
Bytes                           80
Type                            string

C:\Users\92403>redis-memory-for-key -s 192.168.0.112 -p 6379 str2
Key                             str2
Bytes                           80
Type                            string

#更多请参考:
C:\Users\92403>rdb --help
四、总结

1、如果想粗略的看下最大key, 可以使用bigKeys。
2、如果查询的key不多,key的压缩比又没有明显差异,可以使用debug object key。
3、如果不介意安装个工具,那么redis rdb tools似乎是最佳选择。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值