# 慢查詢日志
Redis 的慢查詢日志功能用于記錄執行時間超過給定時長的命令請求, 用戶可以通過這個功能產生的日志來監視和優化查詢速度。
服務器配置有兩個和慢查詢日志相關的選項:
* `slowlog-log-slower-than`?選項指定執行時間超過多少微秒(`1`?秒等于?`1,000,000`?微秒)的命令請求會被記錄到日志上。
舉個例子, 如果這個選項的值為?`100`?, 那么執行時間超過?`100`?微秒的命令就會被記錄到慢查詢日志; 如果這個選項的值為?`500`?, 那么執行時間超過?`500`?微秒的命令就會被記錄到慢查詢日志; 諸如此類。
* `slowlog-max-len`?選項指定服務器最多保存多少條慢查詢日志。
服務器使用先進先出的方式保存多條慢查詢日志: 當服務器儲存的慢查詢日志數量等于?`slowlog-max-len`?選項的值時, 服務器在添加一條新的慢查詢日志之前, 會先將最舊的一條慢查詢日志刪除。
舉個例子, 如果服務器?`slowlog-max-len`?的值為?`100`?, 并且假設服務器已經儲存了?`100`?條慢查詢日志, 那么如果服務器打算添加一條新日志的話, 它就必須先刪除目前保存的最舊的那條日志, 然后再添加新日志。
讓我們來看一個慢查詢日志功能的例子, 首先用?CONFIG_SET?命令將?`slowlog-log-slower-than`?選項的值設為?`0`?微秒, 這樣 Redis 服務器執行的任何命令都會被記錄到慢查詢日志中, 接著將?`slowlog-max-len`?選項的值設為?`5`?, 讓服務器最多只保存?`5`?條慢查詢日志:
~~~
redis> CONFIG SET slowlog-log-slower-than 0
OK
redis> CONFIG SET slowlog-max-len 5
OK
~~~
接著, 我們用客戶端發送幾條命令請求:
~~~
redis> SET msg "hello world"
OK
redis> SET number 10086
OK
redis> SET database "Redis"
OK
~~~
然后使用?SLOWLOG GET?命令查看服務器所保存的慢查詢日志:
~~~
redis> SLOWLOG GET
1) 1) (integer) 4 # 日志的唯一標識符(uid)
2) (integer) 1378781447 # 命令執行時的 UNIX 時間戳
3) (integer) 13 # 命令執行的時長,以微秒計算
4) 1) "SET" # 命令以及命令參數
2) "database"
3) "Redis"
2) 1) (integer) 3
2) (integer) 1378781439
3) (integer) 10
4) 1) "SET"
2) "number"
3) "10086"
3) 1) (integer) 2
2) (integer) 1378781436
3) (integer) 18
4) 1) "SET"
2) "msg"
3) "hello world"
4) 1) (integer) 1
2) (integer) 1378781425
3) (integer) 11
4) 1) "CONFIG"
2) "SET"
3) "slowlog-max-len"
4) "5"
5) 1) (integer) 0
2) (integer) 1378781415
3) (integer) 53
4) 1) "CONFIG"
2) "SET"
3) "slowlog-log-slower-than"
4) "0"
~~~
如果這時再執行一條?SLOWLOG GET?命令, 那么我們將看到, 上一次執行的?SLOWLOG GET?命令已經被記錄到了慢查詢日志中, 而最舊的、編號為?`0`?的慢查詢日志已經被刪除, 服務器的慢查詢日志數量仍然為?`5`?條:
~~~
redis> SLOWLOG GET
1) 1) (integer) 5
2) (integer) 1378781521
3) (integer) 61
4) 1) "SLOWLOG"
2) "GET"
2) 1) (integer) 4
2) (integer) 1378781447
3) (integer) 13
4) 1) "SET"
2) "database"
3) "Redis"
3) 1) (integer) 3
2) (integer) 1378781439
3) (integer) 10
4) 1) "SET"
2) "number"
3) "10086"
4) 1) (integer) 2
2) (integer) 1378781436
3) (integer) 18
4) 1) "SET"
2) "msg"
3) "hello world"
5) 1) (integer) 1
2) (integer) 1378781425
3) (integer) 11
4) 1) "CONFIG"
2) "SET"
3) "slowlog-max-len"
4) "5"
~~~
- 介紹
- 前言
- 致謝
- 簡介
- 第一部分:數據結構與對象
- 簡單動態字符串
- SDS 的定義
- SDS 與 C 字符串的區別
- SDS API
- 重點回顧
- 參考資料
- 鏈表
- 鏈表和鏈表節點的實現
- 鏈表和鏈表節點的 API
- 重點回顧
- 字典
- 字典的實現
- 哈希算法
- 解決鍵沖突
- rehash
- 漸進式 rehash
- 字典 API
- 重點回顧
- 跳躍表
- 跳躍表的實現
- 跳躍表 API
- 重點回顧
- 整數集合
- 整數集合的實現
- 升級
- 升級的好處
- 降級
- 整數集合 API
- 重點回顧
- 壓縮列表
- 壓縮列表的構成
- 壓縮列表節點的構成
- 連鎖更新
- 壓縮列表 API
- 重點回顧
- 對象
- 對象的類型與編碼
- 字符串對象
- 列表對象
- 哈希對象
- 集合對象
- 有序集合對象
- 類型檢查與命令多態
- 內存回收
- 對象共享
- 對象的空轉時長
- 重點回顧
- 第二部分:單機數據庫的實現
- 數據庫
- 數據庫鍵空間
- 重點回顧
- RDB 持久化
- RDB 文件結構
- 重點回顧
- AOF 持久化
- AOF 持久化的實現
- 重點回顧
- 事件
- 文件事件
- 重點回顧
- 參考資料
- 客戶端
- 客戶端屬性
- 重點回顧
- 服務器
- 命令請求的執行過程
- 重點回顧
- 第三部分:多機數據庫的實現
- 復制
- 舊版復制功能的實現
- 重點回顧
- Sentinel
- 啟動并初始化 Sentinel
- 重點回顧
- 參考資料
- 集群
- 節點
- 重點回顧
- 第四部分:獨立功能的實現
- 發布與訂閱
- 頻道的訂閱與退訂
- 重點回顧
- 參考資料
- 事務
- 事務的實現
- 重點回顧
- Lua 腳本
- 創建并修改 Lua 環境
- 重點回顧
- 排序
- SORT <key> 命令的實現
- 重點回顧
- 二進制位數組
- GETBIT 命令的實現
- 重點回顧
- 慢查詢日志
- 慢查詢記錄的保存
- 慢查詢日志的閱覽和刪除
- 添加新日志
- 重點回顧
- 監視器
- 成為監視器
- 向監視器發送命令信息
- 重點回顧
- 源碼、相關資源和勘誤