一日一技:可視化分析 Redis Key 資源占用情況
Redis 在日常的開發(fā)中,會(huì)積累大量的 Key,占用不少內(nèi)存空間。有時(shí)候,我們想知道當(dāng)前 Redis 里面有多少個(gè) Key,是哪個(gè) Key 占用了最大的內(nèi)存。
但是,我們知道,由于 Redis 是單線程數(shù)據(jù)庫(kù),所以在線上環(huán)境是絕對(duì)禁止使用keys *這種命令的,因?yàn)樗鼤?huì)花費(fèi)很長(zhǎng)時(shí)間掃描所有的 Key,在這個(gè)過(guò)程中,Redis 會(huì)卡死,無(wú)法處理其他的讀寫操作。
那么,我們應(yīng)該怎么知道當(dāng)前有多少個(gè) Key 呢?有同學(xué)說(shuō)可以使用scan命令。但這個(gè)命令一方面是需要寫程序來(lái)迭代,另一方面是它給出的結(jié)果可能是不準(zhǔn)確的。
也有同學(xué)會(huì)說(shuō),可以使用info keyspace命令,運(yùn)行效果如下圖所示:
確實(shí)可以看到有多少個(gè) Key。不過(guò)另一個(gè)問(wèn)題是,怎么知道哪個(gè) Key 占用的內(nèi)存空間最大?
還有時(shí)候,Redis 里面可能有幾萬(wàn)十幾萬(wàn)個(gè) Key,里面有些 Key 是可以刪掉的。但是由于我們不能使用keys命令查看當(dāng)前有哪些 Key,所以不知道這些可以刪掉的 Key 竟然還在。
實(shí)際上,這些問(wèn)題,我們使用一個(gè)叫做RDR[1]的工具,都可以解決。在 RDR 的 Github 上,可以找到對(duì)應(yīng)系統(tǒng)的可執(zhí)行文件。我們以 Linux 版本為例來(lái)進(jìn)行說(shuō)明。Linux 版本的可執(zhí)行文件地址為:https://github.com/xueqiu/rdr/releases/download/v0.0.1/rdr-linux,下載以后,賦予可執(zhí)行權(quán)限:
- cd ~
- wget https://github.com/xueqiu/rdr/releases/download/v0.0.1/rdr-linux
- chmod +x rdr-linux
接下來(lái),我們需要找到dump.rdb文件。
Redis 默認(rèn)開啟了RDB方式的持久化儲(chǔ)存。滿足一定條件時(shí),Redis 會(huì)把內(nèi)存中的數(shù)據(jù)存放到硬盤中,防止由于突然斷電導(dǎo)致數(shù)據(jù)丟失。默認(rèn)情況下,RDB 文件在/var/lib/redis/dump.rdb,這個(gè)文件只有 root 用戶可以讀取。
如果你現(xiàn)在不是 root 用戶,那么你可以把它復(fù)制出來(lái),修改成當(dāng)前用戶,我的 Linux 系統(tǒng)當(dāng)前用戶名叫做 kingname,所在的用戶組也叫 kingname,所以可以執(zhí)行如下 shell 命令:
- cd ~
- sudo cp /var/lib/redis/dump.rdb ./
- sudo chown kingname:kinganme dump.rdb
修改了用戶以后,現(xiàn)在我們讓 RDR 來(lái)讀取這個(gè)RDB 文件:
- ./rdr-linux show -p 8766 dump.rdb
運(yùn)行效果如下圖所示:
現(xiàn)在,打開瀏覽器,打開http://IP:8766,就可以看到當(dāng)前 Redis 的各個(gè) Key 的統(tǒng)計(jì)信息:
不僅可以看到Redis 有哪些 Key,還能看到每個(gè) Key 里面有多少元素,大小是多少。
而且由于是分析的 RDB 文件,所以也完全不需要擔(dān)心對(duì)線上數(shù)據(jù)造成任何影響。
有了這個(gè)工具以后,要找出占用空間最大的 Key,就非常簡(jiǎn)單了。
參考資料[1]RDR: https://github.com/xueqiu/rdr
本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。