Redis Key資源佔用情況的視覺化分析

Redis 在日常的開發中,會積累大量的 Key,佔用不少記憶體空間。有時候,我們想知道當前 Redis 裡面有多少個 Key,是哪個 Key 佔用了最大的記憶體。

但是,我們知道,由於 Redis 是單執行緒資料庫,所以在線上環境是絕對禁止使用keys *這種命令的,因為它會花費很長時間掃描所有的 Key,在這個過程中,Redis 會卡死,無法處理其他的讀寫操作。

那麼,我們應該怎麼知道當前有多少個 Key 呢?有同學說可以使用scan命令。但這個命令一方面是需要寫程式來迭代,另一方面是它給出的結果可能是不準確的。

也有同學會說,可以使用info keyspace命令,執行效果如下圖所示:

Redis Key資源佔用情況的視覺化分析

確實可以看到有多少個 Key。不過另一個問題是,怎麼知道哪個 Key 佔用的記憶體空間最大?

還有時候,Redis 裡面可能有幾萬十幾萬個 Key,裡面有些 Key 是可以刪掉的。但是由於我們不能使用keys命令檢視當前有哪些 Key,所以不知道這些可以刪掉的 Key 竟然還在。

實際上,這些問題,我們使用一個叫做RDR[1]的工具,都可以解決。在 RDR 的 Github 上,可以找到對應系統的可執行檔案。我們以 Linux 版本為例來進行說明。Linux 版本的可執行檔案地址為:https://github。com/xueqiu/rdr/releases/download/v0。0。1/rdr-linux,下載以後,賦予可執行許可權:

cd ~ wget https://github。com/xueqiu/rdr/releases/download/v0。0。1/rdr-linux chmod +x rdr-linux

接下來,我們需要找到dump。rdb檔案。

Redis 預設開啟了RDB方式的持久化儲存。滿足一定條件時,Redis 會把記憶體中的資料存放到硬碟中,防止由於突然斷電導致資料丟失。預設情況下,RDB 檔案在/var/lib/redis/dump。rdb,這個檔案只有 root 使用者可以讀取。

如果你現在不是 root 使用者,那麼你可以把它複製出來,修改成當前使用者,我的 Linux 系統當前使用者名稱叫做 kingname,所在的使用者組也叫 kingname,所以可以執行如下 shell 命令:

cd ~ sudo cp /var/lib/redis/dump。rdb 。/ sudo chown kingname:kinganme dump。rdb

修改了使用者以後,現在我們讓 RDR 來讀取這個RDB 檔案:

。/rdr-linux show -p 8766 dump。rdb

執行效果如下圖所示:

Redis Key資源佔用情況的視覺化分析

現在,開啟瀏覽器,開啟http://IP:8766,就可以看到當前 Redis 的各個 Key 的統計資訊:

Redis Key資源佔用情況的視覺化分析

不僅可以看到Redis 有哪些 Key,還能看到每個 Key 裡面有多少元素,大小是多少。

而且由於是分析的 RDB 檔案,所以也完全不需要擔心對線上資料造成任何影響。

有了這個工具以後,要找出佔用空間最大的 Key,就非常簡單了。