Redis 使用指南:深度解析 info 命令


Redis 是一個使用  ANSI C 編寫的開源、基於內存、可選持久性的鍵值對存儲數據庫,被廣泛應用於大型電商網站、視頻網站和游戲應用等場景,能夠有效減少數據庫磁盤 IO, 提高數據查詢效率,減輕管理維護工作量,降低數據庫存儲成本。對傳統磁盤數據庫是一個重  要的補充,成為了互聯網應用,尤其是支持高並發訪問的互聯網應用必不可少的基礎服務之一。它的主要優勢有以下幾方面:

  •   首先性能極高,正因為是內存型數據庫,讀寫操作全在內存進行,因此 Redis 讀寫的速度能到 10 萬 ops。
  •   Redis 相對於其它內存數據庫,還提供豐富的數據接口:如字符串(strings),  散列

(hashes),  列表(lists),  集合(sets),  有序集合(sorted sets)  等,設置包括 bitmaps,hyperloglogs 和 地理空間(geo)操作查詢。這也許是大多數開發者相對於其它內存數據庫選擇 Redis 一個重要原因。

  •   雖然是內存型數據庫,但它也提供持久化功能。

Redis 目前在 DB-Engines Ranking(https://db-engines.com/en/ranking)排名第 7,幾乎所有的公有雲平台都提供了 Redis 服務。雖然 Redis 性能高,但我們平時在使用 Redis 的過程中,也應該關注其運行時的狀態,根據這些信息,我們一方面可以優化使用 Redis 的方法,另一方面當應用程序出現超時、響應極慢的情況時,可以進行分析。

到這里,就必須要說到 Redis 提供的一個非常有用的查看狀態信息的命令:info,使用 redis-cli 連上 redis,輸入 info all 命令,redis-server 就會返回 Redis 的狀態信息,詳細內容如下:

 

參數名

說明

server

獲取 server 信息,包括 version, OS, port 等信息

clients

獲取 clients 信息,如客戶端連接數等

memory

獲取 server 的內存信息,包括當前內存消耗、內存使用峰值

persistence

獲取 server 的持久化配置信息

stats

獲取 server 的一些基本統計信息,如處理過的連接數量等

replication

獲取 server 的主從配置信息

cpu

獲取 server 的 CPU 使用信息

keyspace

 

獲取 server 中各個 DB 的 key 的數量

 

 

cluster

獲取集群節點信息,僅在開啟集群后可見

commandstas

獲取每種命令的統計信息

 

 

其中 memory,stats,clients,keyspace 是 Redis 運行時經常要關注的信息,能

夠有效幫我們本文重點對這四欄中我們需要詳細了解的信息。

一、深度剖析 Redis 最重要的 memory

對於 Redis 來說,內存是最重要的資源,所以本文首先介紹 Redis 內存狀態信息怎么查看, 也就是 memory 這一欄:

  •   used_memory:Redis 分配器分配的內存量,也就是實際存儲數據的內存總量。
  •   used_memory_human:以可讀格式顯示 used_memory。
  •   used_memory_rss:以操作系統的角度,顯示 Redis 進程占用的總物理內存。
  •   used_memory_rss_human:以可讀格式顯示 used_memory_rss
  •   mem_fragmentation_ratio:used_memory_rss /used_memory 比值,表示內存碎片率。其中 used_memory 反映了當前 Redis 存儲數據的內存使用情況,當內存使用率達到

Redis 設置的 maxmemory 時,Redis 就會根據設置內存數據逐出策略,以不同的方式移除存儲在內存中的數據。比如,如果設置的策略為 noeviction,那么 Redis 會直接返回錯誤提示。

mem_fragmentation_ratio 表示的內存碎片率,理解這一指標,對優化 Redis 實例的資源性能是非常重要的。內存碎片率稍大於 1 是比較合理的范圍,此時內存碎片率還比較低,同時也說明  Redis 沒有發生  swap。但如果內存碎片率的值超過了  1.5,那就說明

Redis 消耗了實際需要物理內存的  150%,其中有  50%是內存碎片率,可以直接判定為

Redis 內存碎片過大。內存碎片率是不是越低就越好呢?答案是否定的。當內存碎片率低於 1 時,說明 Redis 內存分配超出了物理內存,操作系統正在進行 swap,Redis 可能會把部分數據交換到硬盤上。swap 會嚴重影響 Redis 的性能,造成極大的延遲。

 

二、stats 幫你全面理解 Redis 狀態

stats 可以統計 Redis 的基礎信息,比如 Redis 的連接數、命令、網絡、同步狀態等非常重要的信息。下面介紹以下幾個比較重要的信息:

  •   total_connections_received:連接過的客戶端總數。
  •   total_commands_processed:處理過的命令總數。
  •   instantaneous_ops_per_sec:每秒處理的命令數。
  •   keyspace_hits:keyspace 命中次數。

 

  •   keyspace_misses:keyspace 未命中次數。
  •   rejected_connections:由於 maxclients 限制而拒絕的連接數量。
  •   expired_keys:key 過期事件的總數。
  •   evicted_keys:由於 maxmemory 限制,而被回收內存的 key 的總數。

total_connections_received 和 total_commands_processed 反映了 Redis 服務器自從啟動以來,所有處理過的連接數和命令數。instantaneous_ops_per_sec 反應了 Redis 服務器的忙碌狀態。當 rejected_connections 的值不為 0 時,說明應用的連接數過多, 或者 maxclients 配置的太小。

對於應用來說,  keyspace_hits 和  keyspace_misses 這兩項指標是非常關鍵的。

Redis 對其所有的命令都設置了專門的標識屬性,如“只讀”,“寫”或者“管理命令”之類,在 Redis 源碼中,查看一下 redisCommand 結構體中 sflags 成員屬性字段,就可以知道這個命令是具有哪些屬性。比如,w 表示一個寫命令(如  set,del 命令),r 表示是一個只讀命令( get , hmget 命令), a 則表示一個管理命令(config,shutdown) 。其中

keyspace_hits 和 keyspace_misses 都是針對具備只讀屬性的 Redis 操作命令做統計,如果 info 統計出來的 keyspace_misses 值過高,或者在過去一段時間內增長很快,那么就說明這一段時間從  Redis 中獲取數據都沒有拿到,這時也許就需要檢查一下應用數據在

Redis 中的存放和訪問情況了。如果 key 在明確的時間周期內被使用,或者舊的 key 將來可能不會被使用,就可以用 Redis 過期時間命令(expire,expireat, pexpire, pexpireat 等)去設置過期時間,這樣  Redis 就會在  key 過期時自動刪除  key,這個信息可以通過

expired_keys 去查看。當內存使用達到設置的最大閥值 maxmemory 時,Redis 則會根據設置的 key 逐出策略,淘汰 Redis 中存儲的數據,這個信息可以根據 evicted_keys 查看。

 

三、解讀 Redis 連接數的意義

clients 包含了連接數,輸入輸出緩沖和阻塞命令連接數等情況。

  •   connected_clients:客戶端連接的數量。
  •   client_longest_output_list:當前的客戶端連接之中最長的輸出列表。
  •   client_biggest_input_buf:當前的客戶端連接之中最大的輸入緩沖區。
  •   blocked_clients:由於阻塞調用(BLPOP、BRPOP、BRPOPLPUSH)而等待的客戶端的數量。

連接數其實對於 Redis 來說可以看做是一種有限資源,一般 Redis 都配置有最大連接

 

數 限 制 , 因 此 了 解 這 個 對 於 確 保 應 用 正 常 連 接 也 是 相 當 重 要 的 。 

client_longest_output_list 過高則很可能說明現在 Redis 出現了異常,可能要結合clients list 來排查客戶端連接情況。使用了阻塞命令時,blocked_clients 也需要重點關注。

 

四、Keyspace 幫你了解數據狀態

Keyspace 主要提供關於每個 Redis 數據庫的主字典的統計數據。這些統計數據包括鍵的數量、具有過期時間的 key 的數量和平均生存時間。對於每個數據庫來說,

keyspace 欄顯示的每行信息格式如下所示: dbX: keys=X,expires=X,avg_ttl=X

其中,第一個 X 表示數據庫的編號,第二個 X 表示鍵的數量,第三個 X 表示具有過期時間的鍵的數量,第四個 X 表示鍵的平均生存時間。舉個例子:

db0:keys=6,expires=0,avg_ttl=0:這就表示當前數據庫 0 的 key 總數有 6 個,帶有過期時間的 key 總數 0 個,平均存活時間為 0。

 

Redis Info 命令的其它信息,在這里也簡要介紹一下:如 server 欄,是會顯示關於 Redis 服務器自身的一些信息, 如版本號, 操作系統, 端口等。Persistence 和

replication 則與數據庫持久化和主備復制有關,cpu 反映了 Redis 服務器 CPU 使用信息,

commandstas 是顯示  Redis 所有命令執行的詳細信息,包括命令調用次數、命令消耗的

CPU 時間總量、每次執行命令消耗 CPU 時間的平均值。Cluster 主要用來反應集群特性。關於更多 Redis 的使用指南,可以到華為雲 Redis 官網上了解,也可以試用免費的

Redis    ,    來    體    驗    一    下    內    存    數    據    庫    的    使    用    感    受    :

http://www.huaweicloud.com/product/dcs.html。分布式緩存服務  DCS 是華為雲上的

Redis 內存數據庫服務,基於雙機熱備的高可用架構,擁有豐富的緩存類型,能夠很好地滿足用戶高讀寫性能及快速數據訪問的業務訴求。分布式緩存服務能夠有效加快應用的處  理速度,提升熱點數據訪問速度,大幅降低數據庫讀寫頻率,降低業務對整體架構的壓力, 具有高可靠、在線擴展、一鍵運維等特點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM