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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM