背景

线上经常遇到用户想知道自己 Redis 实例中数据的内存分布情况。为了不影响线上实例的使用,我们一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析。总的来说,整个分析的过程简单而实用,是每一个 Redis 的用户都非常值得掌握的一个方法。

创建备份

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

生成内存快照

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

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

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

redis-rdb-tools 安装

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

使用 PYPI 安装

  1. pip install rdbtools

从源码安装

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

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

生成内存快照的命令为:

  1. rdb -c memory dump.rdb > memory.csv

生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值。memory.csv 例子:

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

分析内存快照

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

导入方法

  1. sqlite3 memory.db
  2. 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));
  3. sqlite>.mode csv memory
  4. sqlite>.import memory.csv memory

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

查询key个数

  1. sqlite>select count(*) from memory;

查询总的内存占用

  1. sqlite>select sum(size_in_bytes) from memory;

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

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

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

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

总结

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

  1. rdb -c memory dump.rdb > memory.csv;
  2. sqlite3 memory.db
  3. 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));
  4. sqlite>.mode csv memory
  5. sqlite>.import memory.csv memory

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

(转自阿里云)

redis内存分析(转)的更多相关文章

  1. redis内存分析工具rdbtools

    当Redis的内存已经快满的时候,我们能做什么呢? 最直接的方法就是分析一下Redis内存的构成,看是哪些键比较大,或者比较多,然后考虑一下对应的功能能不能优化,例如减少超时时间,例如不必要的数据不用 ...

  2. Redis内存分析工具—redis-rdb-tools (转载http://www.voidcn.com/article/p-axfdqxmd-bro.html)

    redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生成json文件或者生成报表用来分析Redis的使用详情.使用标准的diff工具比较 ...

  3. 关于redis内存分析,内存优化

    对于redis来说,什么是最重要的? 毋庸置疑,是内存. 一.reids 内存分析 redis内存使用情况:info memory 示例: 可以看到,当前节点内存碎片率为226893824/20952 ...

  4. Redis内存分析方法

    一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析. BGSAVE:在后台异步(Asynchronously)保存当前数据 ...

  5. Redis内存分析工具之redis-rdb-tools的安装与使用

    操作系统:Centos7    1.redis-rdb-tools工具是用python语言编写的,所以首先需要安装python: 安装: (1)用 wget 下载 python 2.7 并解压( 如果 ...

  6. Redis内存分析工具redis-rdb-tools

    一.安装redis-rdb-tools(项目地址:github) # git clone https://github.com/sripathikrishnan/redis-rdb-tools# cd ...

  7. 安装Redis内存分析工具rdbtools

    一.安装Python2.7 1. wget http://10.12.29.98:8090/tools/Python-2.7.11.tgz 2. ln -s /usr/local/python2.7/ ...

  8. redis 源代码分析(一) 内存管理

    一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中 ...

  9. redis redis常用命令及内存分析总结(附RedisClient工具简介

    redis常用命令及内存分析总结(附RedisClient工具简介 by:授客 QQ:1033553122 redis-cli工具 查看帮助 连接redis数据库 常用命令 exists key se ...

随机推荐

  1. HDU 1308 What Day Is It?(模拟,日期)

    解题报告:输入一个年月日,让你求出那一天是星期几,但是做这题之前必须先了解一点历史.首先在1582年之前,判断是否是闰年的标准是只要能被四整除就是闰年, 然后在1752年9月2号的后的11天被抹去了, ...

  2. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

  3. Tarjan+topsort(DP)【P3387】 [模板]缩点

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  4. 【棋盘DP】【OpenJudge7614】最低通行费

    最低通行费 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方 ...

  5. Swift中的GCD——常见的dispatch方法

    什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...

  6. android中使用gdbserver调试c程序

    先废话两句,这篇文章可能有所缺陷,因为我并没有条件去测试动态库的调试.(主要是因为是自己的手机不想乱放各种so) 所以我只能说有空的话我会去进行下测试,这里就先这样了. 1.测试代码gdb-test. ...

  7. Matlab自带的曲线拟合程序

    这个函数的功能是能自动搜索参数的取值,从而使得方程的误差最小. 效果如下 代码如下 %% Optimal Fit of a Non-linear Function % This is a demons ...

  8. WebApi_HelpPage

        HelpPage是描述WebApi接口信息的Web页,根据项目编译的Xml文件生成,包括接口的Router地址.请求参数.请求参数示例.响应参数.响应参数示例等,可方便调用方快速了解接口信息 ...

  9. css的checkbox样式变化

    1.CSS body{font-family:'微软简行楷'} ul li{list-style:none; margin:10px;color:#4985d7;} .myCheck { displa ...

  10. iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)

    介绍: 和音频播放一样,ios也提供个很多的API.如mediaPlayer.framework下的MPMediaPlayerController.AVFounditon.framework下的AVP ...