使用rdbtools分析redis内存使用

介绍

阿里云redis内存使用持续飙升,需要分析下内存使用情况,有发现redis-rdb-tools,支持对rdb文件分析,主要功能有:

  • Generate a Memory Report of your data across all databases and keys
  • Convert dump files to JSON
  • Compare two dump files using standard diff tools

实现

安装

[root@xxx redis]# pip install rdbtools python-lzf
[root@xxx redis]# git clone https://github.com/sripathikrishnan/redis-rdb-tools
[root@xxx redis]# cd redis-rdb-tools
[root@xxx redis]# python setup.py install

参数说明

[root@xxx redis]# rdb --help
Usage: rdb [options] /path/to/dump.rdb

Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

Options:
  -h, --help            show this help message and exit
  -c FILE, --command=FILE
                        Command to execute. Valid commands are json, diff,
                        justkeys, justkeyvals, memory and protocol
  -f FILE, --file=FILE  Output file
  -n DBS, --db=DBS      Database Number. Multiple databases can be provided.
                        If not specified, all databases will be included.
  -k KEYS, --key=KEYS   Keys to export. This can be a regular expression
  -o NOT_KEYS, --not-key=NOT_KEYS
                        Keys Not to export. This can be a regular expression
  -t TYPES, --type=TYPES
                        Data types to include. Possible values are string,
                        hash, set, sortedset, list. Multiple typees can be
                        provided.                      If not specified, all
                        data types will be returned
  -b BYTES, --bytes=BYTES
                        Limit memory output to keys greater to or equal to
                        this value (in bytes)
  -l LARGEST, --largest=LARGEST
                        Limit memory output to only the top N keys (by size)
  -e ESCAPE, --escape=ESCAPE
                        Escape strings to encoding: raw (default), print,
                        utf8, or base64.

生成csv报告

生成报表字段有database(key在redis的db)、type(key类型)、key(key值)、size_in_bytes(key的内存大小)、encoding(value的存储编码形式)、num_elements(key中的value的个数)、len_largest_element(key中的value的长度),可以创建个表的导入到关系型库用SQL语句分析。

[root@xxx redis]# rdb -c memory hins3537653_data_20180427002229.rdb > memory.csv
mysql> CREATE TABLE `redis_memory` (
    -> id int NOT NULL PRIMARY KEY,
    ->   `database` int(128) DEFAULT NULL comment 'key在redis的db',
    ->   `type` varchar(128) DEFAULT NULL comment 'key类型',
    ->   `key` varchar(128) UNIQUE KEY comment 'key值',
    ->   `size_in_bytes` bigint(20) DEFAULT NULL comment 'key的内存大小',
    ->   `encoding` varchar(128) DEFAULT NULL comment 'value的存储编码形式',
    ->   `num_elements` bigint(20) DEFAULT NULL comment 'key中的value的个数',
    ->   `len_largest_element` varchar(128) DEFAULT NULL comment 'key中的value的长度'
    -> );

解析指定key

[root@xxx redis]# rdb --command justkeyvals --key "02796f8159cabac4*" /mnt/redis/hins3537653_data_20180427002229.rdb 

解析特定字符打头指定类型的key

[root@xxx  redis]# rdb -c json --db 0 --type string --key "02796f8159cabac4*" /mnt/redis/hins3537653_data_20180427002229.rdb 

根据使用内存大小排序

-n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号

[root@xxx redis]# sort -t, -k4nr memory.csv

总结

现在是手动实现,可以调用阿里云API实现自动采集和分析后入库,前端接入grafana展示,实现对redis数据使用的监控系统化,同时接入钉钉机器人报警主动推送给业务组优化(后续更新)。

参照

redis-rdb-tools
使用rdbtools工具来解析redis dump.rdb文件及内存使用量

上一篇:Android设置对话框去除黑边


下一篇:IntentService的使用