這是個人第 34 篇原創文章
做者 | 老王(javacn666)
1 面試題java
如何排查 Redis 中的慢查詢?
2 涉及相關問題面試
首先來講 Redis 中有慢查詢日誌,是能夠實現 Redis 慢操做排查的。redis
127.0.0.1:6379> slowlog get #慢日誌查詢 1) 1) (integer) 2 #慢日誌下標 2) (integer) 1581994139 #執行時間 3) (integer) 5 #花費時間 (單位微秒) 4) 1) "set" #執行的具體命令 2) "lang" 3) "java" 5) "127.0.0.1:47068" 6) "" 2) 1) (integer) 1 2) (integer) 1581994131 3) (integer) 6 4) 1) "set" 2) "msg" 3) "xiaoming" 5) "127.0.0.1:47068" 6) "" 3) 1) (integer) 0 2) (integer) 1581994093 3) (integer) 5 4) 1) "config" 2) "set" 3) "slowlog-log-slower-than" 4) "0" 5) "127.0.0.1:47068" 6) ""
慢日誌模擬添加,詳見視頻 。
慢日誌查詢相關的配置信息有兩個:ide
127.0.0.1:6379> config get slowlog-log-slower-than #慢查詢判斷時間 1) "slowlog-log-slower-than" 2) "10000" 127.0.0.1:6379> config get slowlog-max-len #慢查詢最大記錄條數 1) "slowlog-max-len" 2) "128"
能夠看出慢查詢的臨界值是 10000 微秒,默認保存 128 條慢查詢記錄。
4 代碼實戰工具
本文咱們使用 Java 來實現慢查詢日誌的操做,代碼以下:測試
import redis.clients.jedis.Jedis; import redis.clients.jedis.util.Slowlog; import utils.JedisUtils; import java.util.List; /** * 慢查詢 */ public class SlowExample { public static void main(String[] args) { Jedis jedis = JedisUtils.getJedis(); // 插入慢查詢(由於 slowlog-log-slower-than 設置爲 0,全部命令都符合慢操做) jedis.set("db", "java"); jedis.set("lang", "java"); // 慢查詢記錄的條數 long logLen = jedis.slowlogLen(); // 全部慢查詢 List<Slowlog> list = jedis.slowlogGet(); // 循環打印 for (Slowlog item : list) { System.out.println("慢查詢命令:"+ item.getArgs()+ " 執行了:"+item.getExecutionTime()+" 微秒"); } // 清空慢查詢日誌 jedis.slowlogReset(); } }
以上代碼執行結果以下:
慢查詢命令:[SLOWLOG, len] 執行了:1 微秒
慢查詢命令:[SET, lang, java] 執行了:2 微秒
慢查詢命令:[SET, db, java] 執行了:4 微秒
慢查詢命令:[SLOWLOG, reset] 執行了:155 微秒
5 視頻日誌
視頻內容以下:code
6 小結視頻
本文咱們介紹了慢查詢相關的兩個重要參數 slowlog-log-slower-than (用於設置慢查詢的評定時間) 和 slowlog-max-len 用來配置慢查詢日誌的最大記錄數,而後經過修改 config set slowlog-log-slower-than 0 把全部操做都記錄在慢日誌進行相關測試。咱們能夠使用 slowlog get [n] 查詢慢操做日誌,使用 slowlog reset 清空慢查詢日誌。最後給你們一個建議,能夠按期檢查慢查詢日誌,及時發現和改進 Redis 運行中不合理的操做。
更多內容,詳見視頻部分。
【END】
近期熱文blog