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的狀態資訊,詳細內容如下:
其中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,來體驗一下記憶體資料庫。分散式快取服務DCS是華為雲上的Redis記憶體資料庫服務,基於雙機熱備的高可用架構,擁有豐富的快取型別,能夠很好地滿足使用者高讀寫效能及快速資料訪問的業務訴求。分散式快取服務能夠有效加快應用的處理速度,提升熱點資料訪問速度,大幅降低資料庫讀寫頻率,降低業務對整體架構的壓力,具有高可靠、線上擴充套件、一鍵運維等特點。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2156184/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis命令參考之INFO命令詳解Redis
- Redis4.0 info命令彙總詳解Redis
- Redis-cluster命令 cluster info 引數資訊解釋Redis
- redis info memory命令的各項引數解釋彙總Redis
- redis 4.0 info詳解Redis
- Metasploit命令info使用技巧
- Docker映象構建:技術深度解析與實踐指南Docker
- Linux命令實踐Linux
- 《Redis深度歷險:核心原理和應用實踐》讀書筆記Redis筆記
- Redis(五):hash/hset/hget 命令原始碼解析Redis原始碼
- Redis使用與實踐Redis
- redis實踐及思考Redis
- Redis開發使用指南Redis
- 深度解析!Linux 命令 su 和 sudo 的區別Linux
- Redis GEO & 實現原理深度分析Redis
- XML 檔案解析實踐 (DOM 解析)XML
- Spring Data Redis 最佳實踐!SpringRedis
- Redis 實戰 —— 02. Redis 簡單實踐 - 文章投票Redis
- Redis 實戰 —— 05. Redis 其他命令簡介Redis
- Git命令簡潔使用指南Git
- Docker 實踐及命令梳理Docker
- gdb除錯學習與實踐記錄 -- 常用命令解析1除錯
- 【Redis】Redis的操作命令(一)——Redis Key命令Redis
- Taro實踐 - 深度開發實踐體驗及總結
- 雲上深度學習實踐分享——雲上MXNet實踐深度學習
- Redis 實戰 —— 03. Redis 簡單實踐 - Web應用RedisWeb
- Redis原理及實踐之GeoHashRedis
- Redis Cluster深入與實踐(續)Redis
- Redis主從同步配置實踐Redis主從同步
- Python–Redis實戰:第三章:Redis命令:第七節:其他命令PythonRedis
- Optional原始碼解析與實踐原始碼
- Function原始碼解析與實踐Function原始碼
- [Redis原始碼閱讀]實現一個redis命令--nonzerodecrRedis原始碼
- Redis核心原理與實踐--事務實踐與原始碼分析Redis原始碼
- Redis威脅流量監聽實踐Redis
- Redis叢集環境搭建實踐Redis
- Redis在秒殺功能的實踐Redis
- 攜程 Redis On Rocks 實踐,節省 2/3 Redis成本Redis