Redis内存分析方法

    xiaoxiao2026-01-22  7

    背景

    线上经常遇到用户想知道自己Redis实例中数据的内存分布情况。为了不影响线上实例的使用,我们一般会采用bgsave生成dump.rdb文件,再结合redis-rdb-tools和sqlite来进行静态分析。

    创建备份

    自建Redis可在客户端执行bgsave生成rdb文件。阿里云数据库Redis版可以在控制台上可以进行数据备份和下载的操作,下载后的数据为rdb格式文件。步骤详见下图:

    生成内存快照

    redis-rdb-tools是一个python的解析rdb文件工具, 主要有一下三个功能:

    生成内存快照转储成json格式使用标准的diff工具比较两个dump文件

    在分析内存的使后,我们主要用到它的生成内存快照功能。

    redis-rdb-tools安装

    redis-rdb-tools有两种安装方式,任选其一即可。使用PYPI安装

    pip install rdbtools

    从源码安装

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

    使用redis-rdb-tools生成内存快照

    生成内存快照的命令为:

    rdb -c memory dump.rdb > memory.csv

    生成CSV格式的内存报告。包含的列有:数据库ID,数据类型,key,内存使用量(byte),编码。内存使用量包含key、value和其他值。注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值。memory.csv例子:

    $head memory.csv database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,string,"orderAt:377671748",96,string,8,8 0,string,"orderAt:413052773",96,string,8,8 0,sortedset,"Artical:Comments:7386",81740,skiplist,479,41 0,sortedset,"pay:id:18029",2443,ziplist,84,16 0,string,"orderAt:452389458",96,string,8,8

    分析内存快照

    SQLite,是一款轻型的数据库。我们可以将前面生成的csv导入到数据库中之后,就可以利用sql语句很方便的对Redis的内存数据进行各种分析了。导入方法:

    sqlite3 memory.db sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128)); sqlite>.mode csv memory sqlite>.import memory.csv memory

    数据导入以后,接下来想怎么分析就怎么分析了,举几个简单的例子:

    查询key个数

    sqlite>select count(*) from memory;

    查询总的内存占用

    sqlite>select sum(size_in_bytes) from memory;

    查询内存占用最高的10个key

    sqlite>select * from memory order by size_in_bytes desc limit 10;

    查询成员个数1000个以上的list

    sqlite>select * from memory where type='list' and num_elements > 1000 ;

    总结

    通过使用redis-rdb-tools + sqlite的方式,可以方便的对redis实例的内存情况进行静态的分析。整个过程也比较简单,获取到rdb之后

    rdb -c memory dump.rdb > memory.csv; sqlite3 memory.db sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128)); sqlite>.mode csv memory sqlite>.import memory.csv memory

    即可

    实际使用中,发现过一个List积攒了10多G的内容,也发现过43M以上的string类型的value, 往往不仅能解答用户的疑惑,而且能够帮助用户排除业务中潜在的风险点,找到业务性能瓶颈。

    总的来说,整个分析的过程简单而实用,是每一个Redis的用户都非常值得掌握的一个方法。

    广告

    云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用:云数据库 Redis 版

    最新回复(0)