基於Python項目的Redis緩衝消耗記憶體資料簡單分析(附詳細操作步驟)

來源:互聯網
上載者:User

標籤:weight   尾碼   分析   l資料庫   ges   engine   live   family   tab   

目錄

1 準備工作

2 具體實施

 

 

1 準備工作

什麼是Redis?

Redis:一個高效能的key-value資料庫。支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用;提供string、list、set、zset、hash等資料結構的儲存,並支援資料的備份。

 

本文適合使用的情境:當一個項目中Redis緩衝的資料量逐漸增大,Redis緩衝的資料佔用記憶體也會越來越大,而且其中有很多很可能是價值不大的資料。由於Redis是一個key-value資料庫,所以對其中的資料進行分析沒有mysql資料庫那麼直觀。那麼此時,我們需要尋找工具來分析Redis緩衝中的哪些資料佔用記憶體比較大,並結合項目實際的情況來分析這些資料存放區的價值如何?從而作出具體刪減資料的方案,來解放伺服器端寶貴的記憶體資源。

 

本文需要採用的工具:Rdbtools和MySQL。

Rdbtools:使用Python語言編寫的,可以解析Redis的dump.rdb檔案。此外,提供以下工具:

(1)跨所有資料庫和密鑰產生資料的記憶體報告

(2)將dump檔案轉換為JSON

(3)使用標準diff工具比較兩個dump檔案

具體源碼GitHub連結:https://github.com/sripathikrishnan/redis-rdb-tools/

 

MySQL:一種開源且比較輕量級的關係型資料庫。本文使用Rdbtools解析出Redis的dump.rdb檔案並產生記憶體報告*.csv檔案(PS:下文操作檔案為result_facelive_hot.csv),然後把該檔案匯入到MySQL資料庫中,最後通過編寫具體的SQL語句指令碼產生想要的資料分析結果的*.csv檔案(PS:下文SQL指令碼中產生的檔案名稱為redis_key_storage.csv)。

 

 

2 具體實施

Rdbtools工具在以下操作,需要Python2.7或者Python3.6等版本環境的支援。

(1)找到本機項目使用Redis產生的dump.rdb檔案具體所在地址。(PS:本文操作的項目是一個基於Django架構,部署在Ubuntu系統上,所以相關命令都是該系統下的實際操作,其它環境基本類似,就不作介紹)

sudo find / -name ‘*.rdb‘

運行上述命令後,即可看到本機上所有以.rdb為尾碼檔案的所有具體地址,然後根據項目實際情況,找到具體地址。例如,本文找到的地址:

/home/facelive/redis/data/hot/dump.rdb  

PS:有的項目,使用Redis時,會把預設的dump.rdb檔案進行了重新命名,例如命名為db-dump.rdb檔案。那麼此時如何判定具體命名呢?

可以查看項目使用Redis資料庫的redis.conf檔案內容,並結合以下命令:

cat -n redis.conf |grep "dbfilename"

即可查看具體的檔案名稱。

(2)使用Rdbtools產生項目中使用Redis的記憶體使用量的*.csv檔案

此處需要項目先安裝Rdbtools工具,項目且是基於Python環境。啟用項目的虛擬環境,輸入命令:

pip install rdbtools python-lzf

(3)安裝完成後,即可在項目的虛擬環境中使用rdb命令。此處本文產生記憶體報告的命令如下:

rdb -c memory /home/facelive/redis/data/hot/dump.rdb > ~/result_facelive_hot.csv   

產生的result_facelive_hot.csv檔案會存放在伺服器環境根目錄。此時,可以從伺服器把產生的檔案複製到本地,具體操作命令參考:

sudo scp [email protected]:/home/facelive/result_facelive_hot.csv .  # 從伺服器複製遠程檔案到本地當前所在根目錄,這裡的ip是我自己隨便寫的噢

然後在本地開啟result_facelive_hot.csv檔案,結果如下(以下結果是在Windows環境下開啟的噢):

 

可以看到該表中有database(對應的資料庫)、type(緩衝的類型)、key(緩衝的key名稱)、size_in_bytes(該key具體佔用記憶體大小,這是本文資料分析的核心資料)、encoding(緩衝key的編碼)、num_elements和len_larget_element六列資料。

(4)把result_facelive_hot.csv匯入到MySQL資料庫,進行資料分析

首先,選定本地MySQL資料庫中某一已經建立好的資料庫,並在該資料庫中建立一個名稱為redis_hot的表(PS:具體表名可隨意定)

建立表的SQL語句:

DROP TABLE IF EXISTS `redis_hot`;CREATE TABLE `redis_hot` (  `database` int(11) DEFAULT NULL,  `type` varchar(100) DEFAULT NULL,  `key` varchar(200) DEFAULT NULL,  `size_in_bytes` int(11) DEFAULT NULL,  `encoding` varchar(255) DEFAULT NULL,  `num_elements` int(11) DEFAULT NULL,  `len_largest_element` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

建立好redis_hot表後,我們開始使用Navicat工具來進行資料匯入工作。(PS:當然也可以使用代碼來完成資料匯入,這裡本文就只給出一個參考連結,不作詳細介紹,具體在文末可見。)

以下操作是在Windows環境下進行,其它環境使用Navicat視覺化檢視,操作步驟基本類似。

首先,使用Navicat開啟本機資料庫,找到剛剛建立的redis_hot表,滑鼠點擊右鍵,選擇匯入嚮導,具體流程如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

資料匯入完成後,下面正式開始編寫SQL查詢指令碼,產生具體所需分析結果資料。

此處需要分析的資料:

(1)每一種key所在用的總記憶體大小(size_in_bytes_sum)

(2)每一種key的總數(PS:因為有的key設計是首碼+使用者id,這樣的情況都屬於一種key)(record_count)

(3)每一種key所在資料庫(database)

(4)每一種key的資料類型(type)

(5)每一種key的編碼類別型(encoding)

(6)每一種key的名稱(key)

(7)每一種key佔用的平均記憶體大小(size_in_bytes_avg)

 

使用的SQL指令碼代碼如下:

SELECT `database`, type, `key`, encoding, count(`database`) as record_count, SUM(size_in_bytes) as size_in_bytes_sum,AVG(size_in_bytes) as size_in_bytes_avg FROM redis_hot WHERE `key` LIKE ‘user_verify_code_%‘UNIONSELECT `database`, type, `key`, encoding, count(`database`) as record_count, SUM(size_in_bytes) as size_in_bytes_sum,AVG(size_in_bytes) as size_in_bytes_avg FROM redis_hot WHERE `key` LIKE ‘robot_id_list%‘UNIONSELECT `database`, type, `key`, encoding, count(`database`) as record_count, SUM(size_in_bytes) as size_in_bytes_sum,AVG(size_in_bytes) as size_in_bytes_avg FROM redis_hot WHERE `key` LIKE ‘user_last_3_day_duration:%‘/*此處可以繼續使用UNION來並查其他名稱的key具體分析資料,下面一行代碼是產生redis_key_storage.csv檔案,如果注釋掉,就可以直接在Navicat查詢介面查看具體查詢結果*/into outfile ‘E:/redis_key_storage.csv‘ fields terminated by ‘,‘ optionally enclosed by ‘"‘ lines terminated by ‘\r\n‘;  # 其中可以修改具體檔案儲存地址(此處檔案儲存地址:‘E:/redis_key_storage.csv‘)

最終得到的結果資料如下:

 

好啦,介紹這裡就結束了,希望能對觀看本文的同學有所協助~

 

 

參考資料:

1.使用程式碼完成csv檔案匯入Mysql(71436108)

2.使用rdbtools工具來解析redis dump.rdb檔案及記憶體使用量量(http://www.ywnds.com/?p=8441)

3.MySQL必知必會:組合查詢(Union)(1190000007926959)

 

 

 

基於Python項目的Redis緩衝消耗記憶體資料簡單分析(附詳細操作步驟)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.