[转]查找Redis中内存占用大的 key

2022-09-21 635点热度 0人点赞 0条评论

Redis作为一个高性能内存数据库,在实际业务中应用的非常广泛。虽然Redis的性能很好,但是在实际使用过程中,如果使用不当,也会造成一些性能问题,比如数据中存在大key。

什么是大key?

顾名思义就是单个key中的数据比较大。通常来说,单个key的value值不会很大,这种情况下,key的读取、删除操作不会影响性能。如果value过大,读取或删除会相对耗时。

例如一个字符串类型的value最大可以存储512MB的内容,一个列表类型的value最多可以存储2的32次方-1个元素。一般情况下,我们认为字符串类型的key的value值超过10KB,就算大key。

大家都知道,Redis是单线程,耗时操作就会阻塞其它请求,给性能上带来一些影响。所以,不管是作为开发还是运维人员,使用Redis都应该经常关注数据中有没有大key。

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

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

redis-cli --bigkeys -a 123456 -n 1

参数说明

  • -n 参数用来指定数据库编号,没有这个参数就是查找全部;
  • -a 参数设置Redis服务的密码。
$ ./redis-cli --bigkeys -a 123456 -n 1
# Press ctrl+c when you have had enough of it... :)
# You can use -i 0.1 to sleep 0.1 sec every 100 sampled keys
# in order to reduce server load (usually not needed).

Biggest string so far: day:uv:483:1201737600, size: 2
Biggest string so far: day:pv:2013:1315267200, size: 3
Biggest string so far: day:pv:3:1290297600, size: 5
Biggest zset so far: day:topref:2734:1289433600, size: 3
Biggest zset so far: day:topkw:2236:1318723200, size: 7
Biggest zset so far: day:topref:651:1320364800, size: 20
Biggest string so far: uid:3467:auth, size: 32
Biggest set so far: uid:3029:allowed, size: 1
Biggest list so far: last:175, size: 51


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

Sampled 329 keys in the keyspace!
Total key length in bytes is 15172 (avg len 46.12)

Biggest   list found 'day:uv:483:1201737600' has 5235597 items
Biggest    set found 'day:uvx:555:1201737600' has 47 members
Biggest   hash found 'day:uvy:131:1201737600' has 2888 fields
Biggest   zset found 'day:uvz:777:1201737600' has 1000 members

0 strings with 0 bytes (00.00% of keys, avg size 0.00)
19 lists with 5236744 items (05.78% of keys, avg size 275618.11)
50 sets with 112 members (15.20% of keys, avg size 2.24)
250 hashs with 6915 fields (75.99% of keys, avg size 27.66)
10 zsets with 1294 members (03.04% of keys, avg size 129.40)

该命令使用scan方式对key进行统计,所以使用时无需担心对Redis造成阻塞。

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

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

不过,一般情况下,元素多,也意味着占用的内存也多。

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论