redis内存分析
Posted liuzz07
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis内存分析相关的知识,希望对你有一定的参考价值。
redis内存分析和清理
web项目中经常会使用redis作为缓存,当项目了运行一段时间后,由于不恰当的使用方法和需求迭代频繁,导致redis内存快速增长,这时就需要对redis的key进行分析,删掉无用的key以节省空间
使用redis自带的命令查看
使用redis自带的info keyspace
命令可以查看简略的key分布情况
使用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文件如下
上述字段的意义如下:
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 '
';
注意在linux下,结束换行符是‘ ‘
如果报错
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
以上是关于redis内存分析的主要内容,如果未能解决你的问题,请参考以下文章