Redis
提供了5種數據結構,但除此以外,Redis
還提供了注入慢查詢分析,Redis Shell
、Pipeline
、事務、與Lua
腳本、Bitmaps
、HyperLogLog
、PubSub
、GEO
等附加功能,這些功能能夠在某些場景發揮很重要的做用.redis
許多存儲系統(如:MySQL
)提供慢查詢日誌幫助開發與運維人員定位系統存在的慢操做.所謂慢查詢日誌就是系統在命令執行先後計算每條命令的執行時間,當超過預設閾值,就將這條命令的相關信息(例如:發生時間,耗時,命令的詳細信息)記錄到慢查詢日誌中,Redis
也提供了相似的功能.shell
Redis
命令執行流程: 網絡
發送命令數據結構
命令排隊併發
命令執行運維
返回結果ide
須要注意,慢查詢只統計步驟3
的時間,因此沒有慢查詢並不表明客戶端沒有超時問題.工具
對於慢查詢功能,須要明確兩件事:spa
預設閾值怎麼設置?線程
慢查詢記錄存放在那?
Redis
提供了slowlog-log-slower-than
和slowlog-max-len
配置來解決這兩個問題.從字面意思就能夠看出,slowlog-log-slower-than
就是這個預設閾值,它的單位是毫秒(1秒=1000000微秒
)默認值是10000
,假如執行了一條"很慢"的命令(例如key *
),若是執行時間超過10000微秒
,那麼它將被記錄在慢查詢日誌中.
若是
slowlog-log-slower-than=0
會記錄全部命令,slowlog-log-slower-than<0
對於任何命令都不會進行記錄.
從字面意思看,slowlog-max-len
只是說明了慢查詢日誌最多存儲多少條,並無說明存放在哪裏?實際上Redis
使用了一個列表來存儲慢查詢日誌,slowlog-max-len
就是列表的最大長度.一個新的命令知足慢查詢條件時被插入到這個列表中,當慢查詢日誌列表已處於其最大長度時,最先插入的一個命令將從列表中移出,例如slowlog-max-len
設置長度爲64
.當有第65
條慢查詢日誌插入的話,那麼隊頭的第一條數據就出列,第65
條慢查詢就會入列.
在Redis
中有兩種修改配置的方法,一種是修改配置文件,另外一種是使用config set
命令動態修改.例以下面使用config set
命令將slowlog-log-slower-than
設置爲20000微妙
.slowlog-max-len
設置爲1024
:
config set slowlog-log-slower-than 20000 config set slowlog-max-len 1024 config rewrite
若是須要將Redis
將配置持久化到本地配置文件,要執行config rewrite
命令.以下:
雖然慢查詢日誌存放在Redis
內存列表中,可是Redis
並無暴露這個列表的鍵,而是經過一組命令來實現對慢查詢日誌的訪問和管理.
(1) 獲取慢查詢日誌
slowlog get [n]
參數n
能夠指定條數.
例:
127.0.0.1:6370> slowlog get 1) 1) (integer) 666 2) (integer) 1456786500 3) (integer) 11615 4) 1) "BGREWRITEAOF" 2) 1) (integer) 665 2) (integer) 1456718400 3) (integer) 12006 4) 1) "SETEX" 2) "video_info_200" 3) "300" 4) "2" ...
能夠看到每一個查詢日誌有4個屬性組成,分別是慢查詢日誌的表示id
、發生時間戳、命令耗時、執行命令和參數,慢查詢列表:
(2) 獲取慢查詢日誌列表當前長度
slowlog len
例如,當前Redis
中有45
條慢查詢:
127.0.0.1:6370> slowlog len (integer) 23
(3) 慢查詢日誌重置
slowlog reset
實際是對列表作清理操做,例如:
127.0.0.1:6370> slowlog len (integer) 23 127.0.0.1:6370> slowlog reset OK 127.0.0.1:6370> slowlog len (integer) 0
慢查詢功能能夠有效地幫助咱們找到Redis
可能存在的瓶頸,但在實際使用過程當中要注意如下幾點:
slowlog-max-len
:線上建議調大慢查詢列表,記錄慢查詢時Redis
會對長命令作階段操做,並不會佔用大量內存.增大慢查詢列表能夠減緩慢查詢被剔除的可能,例如線上可設置爲1000
以上.
slowlog-log-slower-than
:默認值超過10
毫秒斷定爲慢查詢,須要根據Redis
併發量調整該值.因爲Redis
採用單線程相應命令,對於高流量的場景,若是命令執行時間超過1
毫秒以上,那麼Redis
最多可支撐OPS
不到1000
所以對於高OPS場景下的Redis
建議設置爲1
毫秒.
慢查詢只記錄命令的執行時間,並不包括命令排隊和網絡傳輸時間.所以客戶端執行命令的時間會大於命令的實際執行時間.由於命令執行排隊機制,慢查詢會致使其餘命令級聯阻塞,所以客戶端出現請求超時時,須要檢查該時間點是否有對應的慢查詢,從而分析是否爲慢查詢致使的命令級聯阻塞.
因爲慢查詢日誌是一個先進先出的隊列,也就是說若是慢查詢比較多的狀況下,可能會丟失部分慢查詢命令,爲了防止這種狀況發生,能夠按期執行slowlog get
命令將慢查詢日誌持久化到其餘存儲中(例如:MySQL
、ElasticSearch
等),而後能夠經過可視化工具進行查詢.