業務背景:
Redis中的內存在隨着業務增長的過程中不斷增多,如果大key較多,容易形成性能瓶頸,甚至降低業務穩定性。定期分析內存並根據分析結果優化內存,可以保持服務的穩定和高效。爲了不影響線上Redis服務的運行,可以使用BGSAVE命令生成RDB文件,再結合redis-rdb-tools和SQLite進行靜態分析。下述操作基於已生成RDB文件的基礎上進行分析!
操作步驟:
// ubuntu 安裝pip
apt install python-pip
// 安裝rdbtools
pip install rdbtools
pip install python-lzf
// 安裝 sqlite
apt install sqlite3
// 切換到rdb文件目錄,配置文件默認爲/var/lib/redis,可通過redis info,config_file字段查看
cd /var/lib/redis
// 生成CSV格式的快照:
rdb -c memory dump.rdb > memory.csv
// 使用sqlite導入數據
sqlite3 memory.db
sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128));
sqlite>.mode csv memory
sqlite>.import memory.csv memory
// 導入數據完成,接下來使用sql查詢數據即可
生成的快照包含如下幾列的數據:
- 數據庫ID;
- 數據類型;
- key;
- 內存使用量(Byte),包含key、value和其它值的容量;
使用SQL語句進行分析,部分分析方式的示例如下。
- 查詢內存中的key總數:
sqlite>select count(*) from memory;
- 查詢內存佔用總量:
sqlite>select sum(size_in_bytes) from memory;
- 查詢內存佔用量最高的10個key:
sqlite>select * from memory order by size_in_bytes desc limit 10;
- 查詢元素數量1000以上的list:
sqlite>select * from memory where type='list' and num_elements > 1000;