你知道Redis慢查詢嗎?

一、回顧Redis處理命令全過程

在這裏插入圖片描述

  • 1、發送命令
  • 2、Redis單線程,可以想象成隊列,命令太多處理不過來的情況他會排隊,逐個執行,但Redis可以達到每秒處理萬級別的命令(前提是配置好,比如不能配置aof的always等)
  • 3、執行命令
  • 4、給客戶端返回結果

二、慢查詢

1、說明

慢查詢發生在上圖的第3階段,也就是命令被執行所消耗的時間,比如keys *這種極其耗時的命令。命令通過網絡傳輸所消耗的時間以及排隊等待的時間不算。

2、配置

2.1、slowlog-max-len

存放慢查詢語句的是一個先進先出的隊列,他有固定長度,slowlog-max-len就是控制慢查詢語句數量的,存放到內存中的,默認128,超過128的話會捨棄最先進入隊列的命令。所以一般可以搞大點,因爲他是存放到內存的,重啓就沒了。

slowlog-max-len 128

2.2、slowlog-log-slower-than

慢查詢閾值(單位:微妙,默認是10000,也就是10毫秒)。默認是超過10ms命令沒執行完就扔到慢查詢隊列裏(上面參數控制隊列大小)。Redis號稱QPS萬級別,所以建議設置成1000,也就是1ms。

# 默認10ms
slowlog-log-slower-than 10000
# 0代表記錄所有命令
slowlog-log-slower-than 0
# 小於0代表不記錄任何命令
slowlog-log-slower-than -1

2.3、動態配置

多態更改配置,不需要重啓Redis即可讓慢日誌配置的修改失效。

config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000

3、慢查詢命令

命令 描述
slowlog get [n] 獲取慢查詢隊列的前n條
slowlog len 獲取慢查詢隊列長度
slowlog reset 清空慢查詢隊列

三、實操

(1)動態配置時間爲0,代表每條命令都視爲慢查詢

config set slowlog-max-len 1000
config set slowlog-log-slower-than 0

(2)隨便寫幾個命令

keys *
get k1

(3)看慢查詢隊列

127.0.0.1:6379> slowlog len
(integer) 3
127.0.0.1:6379> SLOWLOG get 3
1) 1) (integer) 4
   2) (integer) 1585794916
   3) (integer) 12
   4) 1) "get"
      2) "k1"
   5) "127.0.0.1:41242"
   6) ""
2) 1) (integer) 3
   2) (integer) 1585794914
   3) (integer) 22
   4) 1) "keys"
      2) "*"
   5) "127.0.0.1:41242"
   6) ""
3) 1) (integer) 2
   2) (integer) 1585794904
   3) (integer) 5
   4) 1) "SLOWLOG"
      2) "reset"
   5) "127.0.0.1:41242"
   6) ""

四、個人建議

  • slowlog-max-len:不要設置過大,默認10ms,建議設置1ms。
  • slowlog-log-slower-than:不要設置過小,建議設置1000左右
  • 定期持久化慢查詢。因爲slowlog-max-len這個隊列是放到內存裏的,重啓就沒了,而且有長度限制,所以我們要查的慢命令多的話根本不顯示,會丟失命令。所以可以用第三方插件持久化到mysql或者自己寫個腳本持久化到mysql或者文件。

五、個人公衆號

微信公衆號【Java碼農社區】
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章