1. 程式人生 > 其它 >Redis 資料庫的簡單分析

Redis 資料庫的簡單分析

1 info memory 詳解

redis-cli 命令列輸入 info memory ,可以看到當前 redis 的記憶體情況,各項引數說明如下:

指標 說明
used_memory 由 Redis 分配器分配的記憶體總量,包含了redis程序內部的開銷和資料佔用的記憶體,以位元組(byte)為單位,即當前redis使用記憶體大小。
used_memory_human 已更直觀的單位展示分配的記憶體總量。
used_memory_rss 向作業系統申請的記憶體大小,與 top 、 ps等命令的輸出一致,即redis使用的實體記憶體大小。
used_memory_rss_human 已更直觀的單位展示向作業系統申請的記憶體大小。
used_memory_peak redis的記憶體消耗峰值(以位元組為單位),即歷史使用記錄中redis使用記憶體峰值。
used_memory_peak_human 以更直觀的格式返回redis的記憶體消耗峰值
used_memory_peak_perc 使用記憶體達到峰值記憶體的百分比,used_memory/ used_memory_peak) 100%,即當前redis使用記憶體/歷史使用記錄中redis使用記憶體峰值100%
used_memory_overhead Redis為了維護資料集的內部機制所需的記憶體開銷,包括所有客戶端輸出緩衝區、查詢緩衝區、AOF重寫緩衝區和主從複製的backlog。
used_memory_startup Redis伺服器啟動時消耗的記憶體
used_memory_dataset 資料實際佔用的記憶體大小,即used_memory-used_memory_overhead
used_memory_dataset_perc 資料佔用的記憶體大小的百分比,100%*(used_memory_dataset/(used_memory-used_memory_startup))
total_system_memory 整個系統記憶體
total_system_memory_human 以更直觀的格式顯示整個系統記憶體
used_memory_lua Lua指令碼儲存佔用的記憶體
used_memory_lua_human 以更直觀的格式顯示Lua指令碼儲存佔用的記憶體
maxmemory Redis例項的最大記憶體配置
maxmemory_human 以更直觀的格式顯示Redis例項的最大記憶體配置
maxmemory_policy 當達到maxmemory時的淘汰策略
mem_fragmentation_ratio 碎片率,used_memory_rss/ used_memory。ratio指數>1表明有記憶體碎片,越大表明越多,<1表明正在使用虛擬記憶體,虛擬記憶體其實就是硬碟,效能比記憶體低得多,這是應該增強機器的記憶體以提高效能。一般來說,mem_fragmentation_ratio的數值在1 ~ 1.5之間是比較健康的。
mem_allocator 記憶體分配器
active_defrag_running 表示沒有活動的defrag任務正在執行,1表示有活動的defrag任務正在執行(defrag:表示記憶體碎片整理)詳解
lazyfree_pending_objects 0表示不存在延遲釋放的掛起物件

2 使用 rdb-tools 分析redis

2.1 rdb-tools 介紹

redis-rdb-tools 是一個 python 的解析 rdb 檔案的工具,在分析記憶體的時候,我們主要用它生成記憶體快照。

原始碼地址:https://github.com/sripathikrishnan/redis-rdb-tools/

主要有以下三個功能:

  • 生成記憶體快照
  • 轉儲成 json 格式
  • 使用標準的 diff 工具比較兩個 dump 檔案

2.2 rbd-tools 安裝

本文安裝環境:

$ python -V
Python 2.7.5
$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

安裝有兩種方式:

  1. 使用 PYPI 進行安裝:
$ pip install rdbtools

如果提示:pip: command not found,則需要進行安裝 pip,安裝完成後再安裝 rdbtools。

$ yum install epel-release
$ yum install -y python-pip

安裝完成後,使用 rdbtools 還需要另外一個包 python-lzf

# 先安裝 python-devel
$  yum install python-devel
# 再安裝 python-lzf
$ pip install python-lzf
  1. 原始碼安裝
$ git clone https://github.com/sripathikrishnan/redis-rdb-tools.git
$ cd redis-rdb-tools
$  python setup.py install

2.3 rbd-tools 使用

rdb-tools 提供了命令 rdb,檢視 rdb 命令的幫助文件:

[root@syushin ~]# rdb -h
usage: usage: rdb [options] /path/to/dump.rdb

# 示例:表示從dump.rdb檔案中分析出所有以`user.`開頭的key並輸出為json格式,輸出到螢幕上
Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

positional arguments:
  dump_file             RDB Dump file to process

optional arguments:
  # 檢視幫助文件
  -h, --help            show this help message and exit
  
  # 必選引數,-c json 表示儲存成json格式,常用的是 -c memory 表示生成csv格式的記憶體快照,還有diff模式進行對比
  -c CMD, --command CMD
                        Command to execute. Valid commands are json, diff,
                        justkeys, justkeyvals, memory and protocol
  # -f 指定輸出到檔案                      
  -f FILE, --file FILE  Output file
  # 只分析指定的redis資料庫,如 -n 0 表示只分析 db0 資料庫,不指定預設包含所有
  -n DBS, --db DBS      Database Number. Multiple databases can be provided.
                        If not specified, all databases will be included.
  # 指定需要匯出的KEY,可以使用正則表示式              
  -k KEYS, --key KEYS   Keys to export. This can be a regular expression
  # 指定不需要匯出的KEY,可以使用正則表示式;
  -o NOT_KEYS, --not-key NOT_KEYS
                        Keys Not to export. This can be a regular expression
  # 指定解析的資料型別,可能的值有 string、hash、set、sortedset、list,可以提供多個型別,如果沒有指定,所有資料型別都返回                     
  -t TYPES, --type TYPES
                        Data types to include. Possible values are string,
                        hash, set, sortedset, list. Multiple typees can be
                        provided. If not specified, all data types will be
                        returned
  # 限制輸出KEY大大小      	              
  -b BYTES, --bytes BYTES
                        Limit memory output to keys greater to or equal to
                        this value (in bytes)
  # 根據大小限制的 top key,如 -l 100 表示當前redis中前 100 的大key                      
  -l LARGEST, --largest LARGEST
                        Limit memory output to only the top N keys (by size)
  # 指定輸出編碼,預設RAW;                   
  -e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
                        Escape strings to encoding: raw (default), print,
                        utf8, or base64.
  # 只有command為protocol模式才有效,表示不輸出所有的可過期的key,只輸出哪些永不過期的key                      
  -x, --no-expire       With protocol command, remove expiry from all keys
  # 只有command為protocol模式才有效,表示給設定過期時間的key增加N秒的過期時間
  -a N, --amend-expire N
                        With protocol command, add N seconds to key expiry
                        time

示例如下:

# 分析當前目錄下的 dump.rdb 檔案,分析前10個大key,將其存入 dump.csv 檔案中
[root@syushin ~]# rdb -c memory dump.rdb -l 10 -f dump.csv

分析完成後會生成 dump.csv 檔案,將其在 Excel 中開啟:

輸出欄位說明:

  • database :key在redis的db
  • type :key型別
  • key :key值
  • size_in_bytes :key的記憶體大小(byte)
  • encoding :value的儲存編碼形式
  • num_elements :key中的value的個數
  • len_largest_element :key中的value的長度
  • expiry :key過期時間

這樣就可以檢視哪些 key 是比較大的。

3 參考資料