redis内存分析

redis内存分析和清理

web项目中经常会使用redis作为缓存,当项目了运行一段时间后,由于不恰当的使用方法和需求迭代频繁,导致redis内存快速增长,这时就需要对redis的key进行分析,删掉无用的key以节省空间

使用redis自带的命令查看

使用redis自带的info keyspace命令可以查看简略的key分布情况

img

使用rdbtools工具分析

rdbtools是用python开发的第三方工具,主要作用有:

1.生成csv分析报告

rdb -c memory dump.rdb > redis_memory_report.csv

2.生成json

rdb -c json dump.rdb > redis_json_report.json

3.比较两个dump文件

rdb -c diff dump1.rdb | sort > dump1.txt
rdb -c diff dump2.rdb | sort > dump2.txt
kdiff3 dump1.txt dump2.txt

补充:需要先安装kdiff3

yum install kdiff3

安装

1.pip安装

pip isntall rdbtools

2.源码安装

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

安装加速工具,加快解析速度

# 安装依赖包
yum install python-devel
# 安装加速工具
pip install python-lzf

生成内存报告

使用之前先要获取到redis的快照(rdb文件),使用以下命令生成内存报告

rdb -c memory dump.rdb -f dump_memory_report.csv

生成的csv文件如下

img

上述字段的意义如下:

database: key的redis的db
type: key速度类型
key: key的名称
size_in_bytes: key的内存大小(byte)
encoding: value的存储编码形式
num_elements: key中的元素的个数(list,set,zset等)
len_largest_element: key中的value的最大长度
expiry: key的过期时间

如果需要对内存报告进行进一步的分析,可以将csv导入mysql

先建一张表

CREATE TABLE redis_memory_report (
    `database` tinyint(2) NOT NULL DEFAULT 0 COMMENT '数据库',
    `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'key类型',
    `key` varchar(255) NOT NULL DEFAULT '' COMMENT 'key',
    `size_in_bytes` int(11) NOT NULL DEFAULT 0 COMMENT '内存大小',
    `encoding` varchar(32) NOT NULL DEFAULT '' COMMENT '编码',
    `num_elements` int(11) NOT NULL DEFAULT 0 COMMENT 'value中元素个数',
    `len_largest_element` int(11) NOT NULL DEFAULT 0 COMMENT 'value的最大长度',
    `expiry` varchar(128) NOT NULL DEFAULT ''
)ENGINE=InnoDB DEFAULT CHARSET=utf8

导入数据

load data infile 'redis_memory_report.csv' into table redis_memory_report
fields terminated by ',' optionally enclosed by '"'
escaped by '"' lines terminated by '\r\n';

注意在linux下,结束换行符是'\n'

如果报错

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
show variables like 'secure%';

结果

+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_auth | ON |
| secure_file_priv | NULL |
+------------------+-------+

说明是secure_file_priv这个变量没有配置造成的

解决办法

找到配置文件my.ini或者my.cnf,在[mysqld]下面加入一行配置

secure_file_priv = '/var'    # 表示允许目录/var下面的文件导入到数据库

将csv文件移到/var目录下,再次执行导入

分析内存报告

1)查询key的个数

select count(*) from dump_memory_report;

2)查询总的内存占用

select count(size_in_bytes) from dump_memory_report;

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

select * from dump_memory_report order by size_in_bytes desc limit 10;

查询单个key所使用的内存量

可以使用redis自带的命令redis-memory-for-keys

redis-memory-for-key 127.0.0.1 -p 6379 -a mypassword key_name

结果

Key                             name
Bytes                           64
Type                            string
posted @ 2020-01-27 17:28  乘月归  阅读(917)  评论(0编辑  收藏  举报