Redis 是一個使用 ANSI C 編寫的開源、基於內存、可選持久性的鍵值對存儲數據庫,被普遍應用於大型電商網站、視頻網站和遊戲應用等場景,可以有效減小數據庫磁盤 IO, 提升數據查詢效率,減輕管理維護工做量,下降數據庫存儲成本。對傳統磁盤數據庫是一個重 要的補充,成爲了互聯網應用,尤爲是支持高併發訪問的互聯網應用必不可少的基礎服務之一。它的主要優點有如下幾方面:html
(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 等,設置包括 bitmaps,hyperloglogs 和 地理空間(geo)操做查詢。這也許是大多數開發者相對於其它內存數據庫選擇 Redis 一個重要緣由。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 運行時常常要關注的信息,能
夠有效幫咱們本文重點對這四欄中咱們須要詳細瞭解的信息。
1、深度剖析 Redis 最重要的 memory
對於 Redis 來講,內存是最重要的資源,因此本文首先介紹 Redis 內存狀態信息怎麼查看, 也就是 memory 這一欄:
Redis 設置的 maxmemory 時,Redis 就會根據設置內存數據逐出策略,以不一樣的方式移除存儲在內存中的數據。好比,若是設置的策略爲 noeviction,那麼 Redis 會直接返回錯誤提示。
mem_fragmentation_ratio 表示的內存碎片率,理解這一指標,對優化 Redis 實例的資源性能是很是重要的。內存碎片率稍大於 1 是比較合理的範圍,此時內存碎片率還比較低,同時也說明 Redis 沒有發生 swap。但若是內存碎片率的值超過了 1.5,那就說明
Redis 消耗了實際須要物理內存的 150%,其中有 50%是內存碎片率,能夠直接斷定爲
Redis 內存碎片過大。內存碎片率是否是越低就越好呢?答案是否認的。當內存碎片率低於 1 時,說明 Redis 內存分配超出了物理內存,操做系統正在進行 swap,Redis 可能會把部分數據交換到硬盤上。swap 會嚴重影響 Redis 的性能,形成極大的延遲。
2、stats 幫你全面理解 Redis 狀態
stats 能夠統計 Redis 的基礎信息,好比 Redis 的鏈接數、命令、網絡、同步狀態等很是重要的信息。下面介紹如下幾個比較重要的信息:
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 查看。
3、解讀 Redis 鏈接數的意義
clients 包含了鏈接數,輸入輸出緩衝和阻塞命令鏈接數等狀況。
鏈接數其實對於 Redis 來講能夠看作是一種有限資源,通常 Redis 都配置有最大鏈接
數 限 制 , 因 此 了 解 這 個 對 於 確 保 應 用 正 常 連 接 也 是 相 當 重 要 的 。
client_longest_output_list 太高則極可能說明如今 Redis 出現了異常,可能要結合clients list 來排查客戶端鏈接狀況。使用了阻塞命令時,blocked_clients 也須要重點關注。
4、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 內存數據庫服務,基於雙機熱備的高可用架構,擁有豐富的緩存類型,可以很好地知足用戶高讀寫性能及快速數據訪問的業務訴求。分佈式緩存服務可以有效加快應用的處 理速度,提高熱點數據訪問速度,大幅下降數據庫讀寫頻率,下降業務對總體架構的壓力, 具備高可靠、在線擴展、一鍵運維等特色。