redis内存分析(转)
背景
线上经常遇到用户想知道自己 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 安装
pip install rdbtools
从源码安装
git clone https://github.com/sripathikrishnan/redis-rdb-toolscd redis-rdb-toolssudo python setup.py install
使用 redis-rdb-tools 生成内存快照
生成内存快照的命令为:
rdb -c memory dump.rdb > memory.csv
生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。
注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值。memory.csv 例子:
$head memory.csvdatabase,type,key,size_in_bytes,encoding,num_elements,len_largest_element0,string,"orderAt:377671748",96,string,8,80,string,"orderAt:413052773",96,string,8,80,sortedset,"Artical:Comments:7386",81740,skiplist,479,410,sortedset,"pay:id:18029",2443,ziplist,84,160,string,"orderAt:452389458",96,string,8,8
分析内存快照
SQLite 是一款轻型的数据库。我们可以将前面生成的 csv 导入到数据库中之后,就可以利用 sql 语句很方便的对 Redis 的内存数据进行各种分析了。
导入方法
sqlite3 memory.dbsqlite> 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 memorysqlite>.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.dbsqlite> 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 memorysqlite>.import memory.csv memory
实际使用中,发现过一个 List 积攒了10多 GB 的内容,也发现过43 MB 以上的 string 类型的 value, 往往不仅能解答用户的疑惑,而且能够帮助用户排除业务中潜在的风险点,找到业务性能瓶颈。
(转自阿里云)
redis内存分析(转)的更多相关文章
- redis内存分析工具rdbtools
当Redis的内存已经快满的时候,我们能做什么呢? 最直接的方法就是分析一下Redis内存的构成,看是哪些键比较大,或者比较多,然后考虑一下对应的功能能不能优化,例如减少超时时间,例如不必要的数据不用 ...
- Redis内存分析工具—redis-rdb-tools (转载http://www.voidcn.com/article/p-axfdqxmd-bro.html)
redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生成json文件或者生成报表用来分析Redis的使用详情.使用标准的diff工具比较 ...
- 关于redis内存分析,内存优化
对于redis来说,什么是最重要的? 毋庸置疑,是内存. 一.reids 内存分析 redis内存使用情况:info memory 示例: 可以看到,当前节点内存碎片率为226893824/20952 ...
- Redis内存分析方法
一般会采用 bgsave 生成 dump.rdb 文件,再结合 redis-rdb-tools 和 sqlite 来进行静态分析. BGSAVE:在后台异步(Asynchronously)保存当前数据 ...
- Redis内存分析工具之redis-rdb-tools的安装与使用
操作系统:Centos7 1.redis-rdb-tools工具是用python语言编写的,所以首先需要安装python: 安装: (1)用 wget 下载 python 2.7 并解压( 如果 ...
- Redis内存分析工具redis-rdb-tools
一.安装redis-rdb-tools(项目地址:github) # git clone https://github.com/sripathikrishnan/redis-rdb-tools# cd ...
- 安装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/ ...
- redis 源代码分析(一) 内存管理
一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中 ...
- redis redis常用命令及内存分析总结(附RedisClient工具简介
redis常用命令及内存分析总结(附RedisClient工具简介 by:授客 QQ:1033553122 redis-cli工具 查看帮助 连接redis数据库 常用命令 exists key se ...
随机推荐
- Android学习--广播机制
广播机制简介 Android的广播可以分为两种类型的,标准广播和有序的广播: 标准广播: 是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播. 有序广播: 是一 ...
- Dfs【p1454】 圣诞夜的极光
题目描述-->p1454 圣诞夜的极光 题意概括: 寻找联通块数量,这里的连通块定义与其他的不同. 这里定义为曼哈顿距离不超过2的都属于一个联通块. 什么?不知道曼哈顿距离是啥? 曼哈顿距离简易 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...
- Android之startActivityForResult
作用:当aAty跳转之bAty时,需要bAty回传数据,使用startActivityForResult. 相关的函数: aAty:--跳转至bAty(intent可以传递数据) void andro ...
- Jackson使用ObjectManage#readValue传入泛型T的问题
说明:没找到合适的方法,持续关注这个问题 参考: https://stackoverflow.com/questions/11664894/jackson-deserialize-using-gene ...
- 关于接口 RandomAccess
今天看到java.util.Collections这个工具类中的 public static <T> void fill(List<? super T> list, T obj ...
- 10个常用的ps命令总结,参数
Linux系统中10个常用的ps命令总结 PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系统在某一事件的进程状态.如果你想不断更新查看的这个状态,可以使用 ...
- 常用vim命令合集
移动命令: h:左移 l:右移 k:上移 j:下移 ^:移动到本行第一个非空白字符上 0:移动到本行第一个字符上 gg:移动到文件头 G = shift + g:移动到文件尾 %:从一个"{ ...
- http://blog.csdn.net/jhg1204/article/details/45013987
http://blog.csdn.net/jhg1204/article/details/45013987
- 'telnet' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
Win7或者win8等是默认没有安装telnet功能,所以你直接用telnet命令是用不了的: 下面介绍在win8下面如何操作:“控制面板”-->“程序”(在左下角)-->程序和功能--- ...