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 '\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