使用rdbtools+MySQL對Redis進行內存占用分析
業務場景
線上某IM業務基于Redis作為持久化層實現,近期出現Redis內存告警,于是對線上Redis各Key內存占用進行分析,便于進行業務改造。
雖然Redis4.0以后提供了memory命令進行內存查詢,但是對于存在大量業務key來說可能不夠方便,只看統計結果又不夠詳細不好定位具體業務,選擇使用rdbtools來進行分析。
分析步驟
1.rdb文件準備
運維提供了阿里云Redis自動備份文件 backupfile.rdb
。當然也可以自行到Redis目錄下獲取 dump.rdb
文件。
2.rdbtools安裝
我這里使用的是linux環境,確保python及pip已經正確安裝。
rdbtools項目地址:https://github.com/sripathikrishnan/redis-rdb-tools
rdbtools安裝,以pip3為例:
pip3 install rdbtools python-lzf
rdbtools生成內存報告:(更多使用方法可以參考官方文檔)
rdb -c memory backupfile.rdb --bytes 128 -f memory.csv
執行內存分析后CPU會跑滿,耐心等待即可。我這里630M共計500萬個key的rdb文件運行了接近10分鐘。
執行完成后在當前目錄文件生成了內存報告文件 memory.csv
。
3.數據導入MySQL
由于生成的內存報告文件 memory.csv
可能很大,直接打開進行分析處理存在限制,將數據導入MySQL。
創建表:
CREATE TABLE `memory` (
`database` int(11) NOT NULL,
`type` varchar(50) NOT NULL,
`key` varchar(255) NOT NULL,
`size_in_bytes` bigint(20) NOT NULL,
`encoding` varchar(50) NOT NULL,
`num_elements` bigint(20) NOT NULL,
`len_largest_element` bigint(20) NOT NULL,
`expiry` bigint(20) DEFAULT NULL,
PRIMARY KEY (`key`) USING BTREE,
KEY `num_elements` (`num_elements`),
KEY `size_in_bytes` (`size_in_bytes`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
此表字段與csv文件字段一一對應,然后將csv文件數據導入該表。
最后通過排序以及key的模糊查詢等手段,即可完成Redis內存分析。