开发者社区> 怀听> 正文

Redis内存分析方法

简介: 线上经常遇到用户想知道自己Redis实例内存使用情况,质疑内存占用量太高。为了不影响线上实例的使用,我们一般会采用bgsave生成dump.rdb文件,再结合redis-rdb-tools和sqlite来进行静态分析。
+关注继续查看

背景

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

创建备份

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

生成内存快照

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

  1. 生成内存快照
  2. 转储成json格式
  3. 使用标准的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 版

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
macOS 11.5 brew install redis错误解决方法
macOS 11.5 brew install redis错误解决方法
176 0
Redis - 利用 Pipeline 加速查询速度的方法
Redis - 利用 Pipeline 加速查询速度的方法
94 0
redis 删除大key集合的方法
redis大key,这里指的是大的集合数据类型,如(set/hash/list/sorted set),一个key包含很多元素。由于redis是单线程,在删除大key(千万级别的set集合)的时候,或者清理过期大key数据时,主线程忙于删除这个大key,会导致redis阻塞、崩溃,应用程序异常的情况。
907 0
Redis去重方法
这篇文章主要介绍了Redis实现唯一计数的3种方法分享,本文讲解了基于SET、基于 bit、基于 HyperLogLog三种方法,需要的朋友可以参考下 唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩展计数的维度,比如除了需要每天的 UV,还想知道每周或每月的 UV,这样导致计算十分复杂。
206 0
redis 简易监控的几种方法
简介 针对Redis 实现性能监控的几种方法 一、使用info命令 命令说明 127.0.0.1:6380> info # Server redis_version:3.2.11 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:41a708998db14d05 redis_mode:standalone os:Linux 3.
5352 0
+关注
怀听
阿里云Redis
文章
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
高并发分布式缓存Redis6.0
立即下载
阿里云Redis服务助力游戏行业发展--王义成
立即下载
国内开发者与Redis开源社区的发展
立即下载