redis數據庫是一個基于內存的 key-value存儲系統,現在redis最常用的使用場景就是存儲緩存用的數據,在需要高速讀/寫的場合使用它快速讀/寫,從而緩解應用數據庫的壓力,進而提升應用處理能力。
許多數據庫會提供慢查詢日志幫助開發和運維人員定位系統存在的慢操作。所謂慢查詢日志就是系統在命令執行前后計算每條命令的執行時間,當然在數據庫中最常見的就是select這些sql語句了,當超過預設閥值,就將這條命令的相關信息(例如:發生時間,耗時,命令的詳細信息)記錄下來,其實Redis也提供了類似的功能。
一、相關參數
Redis主要提供了slowlog-log-slower-than和slowlog-max-len兩個配置參數來提供這項功能。兩項參數分別用來設置慢查詢的閾值以及存放慢查詢的記錄。
slowlog-log-slower-than參數設置什么情況下是慢語句,只有redis命令執行時間大于slowlog-log-slower-than的才會定義成慢查詢,才會被slowlog進行記錄。它的單位是微秒(1秒=1000毫秒=1000000微秒),在初始情況下默認值是10000,也就是10ms,假如執行了一條比較慢的命令,如果它的執行時間超過了 10ms ,那么它將被記錄在慢查詢日志中。(如果slowlog-log-slower-than=0會記錄所有的命令,slowlog-log-slower than<0對于任何命令都不會進行記錄)
slowlog-max-len說明了慢查詢日志最多可以存儲多少條記錄,實際上Redis使用了一個列表來存儲慢查詢日志,slowlog-max-len就是列表的最大長度,它自身是一個先進先出隊列,當slowlog超過設定的最大值后,會將最早的slowlog刪除。簡而言之當一個新的命令滿足慢查詢條件時會被插入到這個列表中,當慢查詢日志列表已處于其最大長度時,最早插入的一個命令將從列表中移出,例如slowlog-max-len設置為 50 ,當有第51條慢查詢插入的話,那么隊頭的第一條數據就出列,第51條慢查詢就會入列。
二、設置redis慢查詢
1、臨時配置:CONFIG命令進行動態配置
#查看 >config get slowlog-log-slower-than >config get slowlog-max-len #配置查詢時間超過1毫米的命令進行記錄并保存500條慢查詢記錄 >config set slowlog-log-slower-than 1000 >config set slowlog-max-len 500
注意通過config命令配置的為動態生效 , 一旦服務重啟則會重新恢復為默認設置 , 所以建議在排查問題時通過config這種方式進行配置 , 但是服務穩定后通過修改配置文件方式進行最終確認 (可以通過config rewrite命令持久化到本地文件 , 但要主要啟動redis時要指定redis.conf文件 該命令才可以生效)。
2、永久配置:配置redis.conf文件
# vi redis.conf slowlog-log-slower-than 1000 slowlog-max-len 500
三、查看redis慢查詢記錄
要想查看所記錄的日志 ,主要使用 SLOWLOG GET 或者 SLOWLOG GET number 命令,前者將會輸出所有的 slow log ,最大長度取決于 slowlog-max-len 選項的值,而 SLOWLOG GET number 則只打印指定數量的日志。
查看當前日志數量: 使用slowlog len命令查看日志數量。
如果日志條數過多,還可以使用slowlog reset命令進行日志清空 。
部分記錄說明:
3) 1) (integer) 25 # 唯一性(unique)的日志標識符 2) (integer) 1565951323 # 被記錄命令的執行時間點,以 UNIX 時間戳格式表示 3) (integer) 22720 # 查詢執行時間,以微秒為單位 4) 1) "SMEMBERS" # 執行的命令,以數組的形式排列 2) "spring:session:expirations:1565950980000" # 這里完整的命令是 SMEMBERS spring:session:expirations:1565950980000