Redis基於RDB實現內存分析

業務背景:

      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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章