基于redis key占用內(nèi)存量分析
Redis的指令看不出哪一類型的key,占用了多少內(nèi)存,不好分析redis內(nèi)存開銷大的情況下,各應(yīng)用程序使用緩存的占比。
借助第3方工具進(jìn)行分析
1、采用2個工具結(jié)合
redis-rdb-tools+sqlite
2、sqlite linux服務(wù)器都會自帶,安裝redis-rdb-tools
使用pip安裝 pip install redis-rdb-tools
源碼安裝
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
python setup.py install
如果不成功安裝 yum install python-setuptools
3、獲取對應(yīng)redis的rdb文件,使用redis-rdb-tools生成內(nèi)存快照
rdb -c memory dump.rdb > memory.csv
注意:內(nèi)存使用量是理論上的近似值,在一般情況下,略低于實際值
4、把數(shù)據(jù)導(dǎo)入sqlite(mysql數(shù)據(jù)庫實際上都能導(dǎo)入),sqlite語法和mysql基本一致
splite3 test.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),time varchar(128)); sqlite>.mode csv memory sqlite>.import memory.csv memory
5、查詢
查詢key個數(shù)
sqlite>select count(*) from memory;
查詢總的內(nèi)存占用
sqlite> select sum(size_in_bytes) from memory;
查詢內(nèi)存占用最高的10個key
sqlite>select * from memory order by size_in_bytes desc limit 10;
補充知識:Redis使用量暴增,快速定位有哪些大key在作怪
發(fā)現(xiàn)redis使用量突然暴增,于是緊急擴(kuò)容redis,不能影響服務(wù)運行。擴(kuò)容之后,趕緊查找原因,突破口就是尋找存在哪些大key。
1. 將redis的dump.rdb文件下載到本地(一般redis的持久化文件以rdb的方式存儲,在redis配置文件可以找到dump.rdb的存儲路徑)。
2. 用rdbtools工具生產(chǎn)內(nèi)存報告,命令是 rdb -c memory,例子:
sudo rdb -c memory /redisfile/dump.rdb >test.csv
注意:rdb文件越大,生成時間越長。
Rdbtools是以python語言開發(fā)的。
GITHUP地址:https://github.com/sripathikrishnan/redis-rdb-tools/
3. 內(nèi)存報告生成后,結(jié)合用linux sort命令排序,根據(jù)內(nèi)存列排序,找出最高的key有哪些。例子:
sudo sort -k4nr -t , test.csv > sort.txt
4. 查看前1000個排序最高的數(shù)據(jù)
awk -F ',' '{print substr($3, 0,18)}' sort.txt | head -1000 | sort -k1 | uniq
5. 查看sort.txt的結(jié)果,一般能得出類似‘my_rank_top'開頭的集合占用最高,排在了前面。
若要查看類似‘my_rank_top'開頭的key總共占用了多少內(nèi)存,可以用命令:
sudo cat sort.txt | grep ‘my_rank_top' | awk -F ',' '{sum += $4};END {print sum}'
6. 得知了my_rank_top這樣的key占用最多內(nèi)存,而且很可能是業(yè)務(wù)已經(jīng)不再需要,但是長期在內(nèi)存中沒清理的,我們可以刪除了這些集合??梢杂媚:ヅ鋕ey來刪除,命令如下:
redis-cli -h 127.0.0.1 -p 6379 keys 'my_ranking_list*' | xargs redis-cli -h 127.0.0.1 -p 6379 del
另附:在本地啟動redis加載dump.rdb文件時,一直load失敗。搞了很長時間,終于找到原因:redis配置文件里databases要修改為256,本地默認(rèn)是16,而產(chǎn)生原始dump.rdb的redis的databases就是25。
以上這篇基于redis key占用內(nèi)存量分析就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSH框架網(wǎng)上商城項目第3戰(zhàn)之使用EasyUI搭建后臺頁面框架
SSH框架網(wǎng)上商城項目第3戰(zhàn)之使用EasyUI搭建后臺頁面框架,討論兩種搭建方式:基于frameset和基于easyUI,感興趣的小伙伴們可以參考一下2016-05-05
Java中ByteArrayInputStream和ByteArrayOutputStream用法詳解
這篇文章主要介紹了Java中ByteArrayInputStream和ByteArrayOutputStream用法詳解,?ByteArrayInputStream?的內(nèi)部額外的定義了一個計數(shù)器,它被用來跟蹤?read()?方法要讀取的下一個字節(jié)2022-06-06
jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例
這篇文章主要介紹了jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例,需要的朋友可以參考下2014-05-05
Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系
這篇文章主要介紹了Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系,Groovy是一種JVM語言,它可以編譯為與Java相同的字節(jié)碼,并且可以與Java類無縫地互操作,Gradle是Java項目中主要的構(gòu)建系統(tǒng)之一,下文關(guān)于兩者的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-02-02

