標籤: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緩衝消耗記憶體資料簡單分析(附詳細操作步驟)