1. 程式人生 > 其它 >線上redis慢查詢排查

線上redis慢查詢排查

一、背景:最近線上redis叢集偶爾會有節點記憶體瞬間暴增,導致節點down掉情況,調整記憶體由32G擴增到64G,問題還是會出現,觀察監控圖發現伺服器流量、IO都無明顯波動

觀察redis日誌:

然後在查詢慢日誌的時候發現了貓膩:

我們先來分析下慢日誌的結果:

 1) 1) (integer) 10214                         #唯一性(unique)的日誌識別符號
    2) (integer) 1623374663                 #被記錄命令的執行時間點,以 UNIX 時間戳格式表示
    3) (integer) 41027078
#查詢執行時間,以微秒為單位 4) 1) "SRANDMEMBER" #執行的命令,以陣列的形式排列 2) "chatroom:r:rids:64234553" #完整慢查詢語句:SRANDMEMBER chatroom:r:rids:64234553 -183463424 3) "-183463424"

結果分析完了,我們再來探討下關於慢查詢的知識:

二、慢查詢

slowlog 是 Redis 用來記錄查詢執行時間的日誌系統。注意,這個查詢執行時間不包括像客戶端響應(talking)、傳送回覆等 IO 操作,而單單是執行一個查詢命令所耗費的時間。

slowlog 儲存在記憶體裡面,讀寫速度非常快,因此我們可以放心地使用它,不必擔心因為開啟 slowlog 而損害 Redis 的速度。

slowlog 有兩個重要的配置,我們先通過 CONFIG GET slowlog-* 命令來檢視現有的配置。

slowlog-log-slower-than 代表慢查詢的閾值,單位為:微秒。當執行查詢命令消耗時間大於配置的閾值時,會將該條命令記錄到慢查詢日誌。當 slowlog-log-slower-than=0 時,記錄所有命令。slowlog-log-slower-than<0 時,不記錄任何命令。slowlog-log-slower-than 的預設值為 10000 (10毫秒,1秒 = 1,000毫秒 = 1,000,000微秒)。

slowlog-max-len 代表慢查詢日誌最大條數。它是一個佇列形式的儲存結構,先進先出的佇列,即當慢查詢日誌達到最大條數後,會銷燬最早記錄的日誌條目。slowlog-max-len 的預設值為 128,儲存在記憶體內,所以重啟 redis 會清空慢查詢日誌。

配置 slowlog-log-slower-than 和 slowlog-max-len 的命令非常簡單,如下:

CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1024

使用 SLOWLOG LEN 命令,查詢當前的慢查詢日誌記錄數。當我們只需要查詢前幾個慢查詢記錄時,可以使用 SLOWLOG GET [n] 命令。SLOWLOG GET [n] 若不加 n ,則獲取全部慢查詢記錄。清空慢查詢日誌使用 SLOWLOG RESET。注意,slowlog-log-slower-than 不要設定過大,設定過大有可能一條記錄也不會記錄。

三、Srandmember命令分析

Redis Srandmember 命令用於返回集合中的一個隨機元素。

從 Redis 2.6 版本開始, Srandmember 命令接受可選的 count 引數:

  • 如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的陣列,陣列中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。
  • 如果 count 為負數,那麼命令返回一個數組,陣列中的元素可能會重複出現多次,而陣列的長度為 count 的絕對值。

該操作和 SPOP 相似,但 SPOP 將隨機元素從集合中移除並返回,而 Srandmember 則僅僅返回隨機元素,而不對集合進行任何改動。

redis Srandmember 命令基本語法如下:

SRANDMEMBER KEY [count]

返回值:只提供集合 key 引數時,返回一個元素;如果集合為空,返回 nil 。 如果提供了 count 引數,那麼返回一個數組;如果集合為空,返回空陣列。

四、總結

那麼找到了慢查詢語句,就等於抓到了大魚,下一步就是讓研發優化了