Redis 慢查詢日誌與簡單動態字串

2021-08-11 19:24:51 字數 2864 閱讀 3601

慢查詢日誌

慢查詢日誌幫助開發和運維人員定位系統存在的慢操作。慢查詢日誌就是系統在命令執行前後計算每條命令的執行時間,當超過預設閥值,就將這條命令的相關資訊(慢查詢id,發生時間戳,耗時,命令的詳細資訊)記錄下來。需要注意,慢查詢日誌只是統計執行命令的時間,所以慢查詢並不代表客戶端沒有超時問題。

慢查詢的配置引數

① 慢查詢的預設閥值 slowlog-log-slower-than

slowlog-log-slower-than引數就是預設閥值,單位是微秒,預設值是1000,如果一條命令的執行時間超過10000微妙,那麼它將被記錄在慢查詢日誌中。

如果slowlog-log-slower-than的值是0,則會記錄所有命令。

如果slowlog-log-slower-than的值小於0,則任何命令都不會記錄日誌。

② 慢查詢日誌的長度slowlog-max-len

slowlog-max-len只是說明了慢查詢日誌最多儲存多少條。redis使用乙個列表來儲存慢查詢日誌,showlog-max-len就是列表的最大長度。當慢查詢日誌已經到達列表的最大長度時,又有慢查詢日誌要進入列表,則最早插入列表的日誌將會被移出列表,新日誌被插入列表的末尾。

慢查詢日誌的組成

慢查詢日誌由以下四個屬性組成:標識id,發生時間戳,命令耗時,執行命令和引數

慢查詢日誌的訪問和管理

① 獲取慢查詢日誌slowlog get [n]

命令:slowlog get [n]

引數:n,可選,代表獲取的日誌條數

② 獲取慢查詢日誌列表的當前長度slowlog len

命令:slowlog len

返回:慢日誌列表的當前長度

③ 慢查詢日誌重置slowlog reset

慢查詢日誌重置實際是對列表做清理操作。

命令:slowlog reset

慢查詢日誌最佳實踐

① slowlog-max-len的設定建議

線上環境建議調大慢查詢日誌的列表,記錄慢查詢日誌時redis會對長命令做截斷操作,並不會占用大量記憶體。增大慢查詢列表可以減緩慢查詢被剔除出列表的可能性。例如線上可以設定為1000以上。

② slowlog-log-lower-than的設定建議

需要根據redis的併發量調整該值。由於redis採用單執行緒響應命令,對於高流量的場景,如果執行命令的時間在1毫秒以上,那麼redis最多可支撐ops(每秒操作次數)不到1000,因此高ops場景的redis建議設定為1毫秒。

③ 慢查詢只記錄命令執行時間,並不包括命令排隊時間和網路傳輸時間。因此客戶端命令的執行時間要大於redis伺服器實際執行命令的時間。因為命令執行排隊機制,慢查詢會導致命令級聯阻塞,因此當客戶端出現請求超時,需要檢查該時間點是否有對應的慢查詢,從而分析是否因為慢查詢導致的命令級聯阻塞

④ 慢查詢日誌是乙個先進先出佇列,慢查詢較多的情況下,可能會丟失部分慢查詢命令,可以定期執行slow get命令將慢查詢日誌持久化到其他儲存中。然後製作視覺化介面查詢。

簡單動態字串介紹:

reids 沒有直接使用c語言傳統的字串表示(以空字元結尾的字元陣列)而是構建了一種名為簡單動態字串的抽象型別,並為redis的預設字串表示,因為c字串不能滿足redis對字串的安全性、效率以及功能方面的需求

sds的定義:

每個sds.h/sdshdr結構表示乙個sds的值

struct sdshdr

sds 與c字串的區別

① 常數複雜度獲取字串長度

當取字串長度時需遍歷整個字串,對字串進行計數直到為空的字串,這個操作的複雜度為o(n)

sds簡單動態字元的結構len屬性就已儲存了sds長度,所以取乙個sds的長度為o(1)

② 杜絕綬沖區溢位

c字串不記錄長度,容易造成溢位

例:假設在程式中有兩個在記憶體中緊鄰著的c字串s1和s2,其中s1儲存了字串」redis」 而s2則儲存了字串」mongodb」

如果我們將執行了stract(s1, 」 cluster」) 卻忘記執行執行前分配足夠的空間,那麼在執行後s1陣列將溢位到s2的空間中,導致s2的內容被意外修改

sds的空間分配策略安全杜絕了發生綬沖區溢位的可能性,當sds api需要對sds進行修改時,api會先檢查sds的空間是否滿足需要,如果不滿足則會自動擴充套件至執行修改所需的大小(屬性len增加),然後才執行實際的修改操作

③ 減少修改字串時帶來的記憶體重分配次數

c字串在修改每乙個字串的增加或縮短時都會進行一次記憶體重分配操作,由於記憶體重分配波及複雜的演算法有可能執行系統的呼叫所以是用乙個比較耗時的操作。

針對c字串的劣勢sds實現了空間預分配和惰性空間釋放兩種優化策略。

空間預留分配:對sds進行修改時對sds進行空間擴充套件的同時,還會對sds分配額外的未使用的空間

分配公式:

sds的屬性小於1mb 將分配同等大小的free屬性 例:sds的len將變成13位元組,那麼程式也會分配13位元組的未使用空間。sds組數的實際長度:13+13+1 = 27(未使用+已使用+1)

sds的屬性大小1mb 如果sds的長度大於1mb將分配1mb的未使用空間,例sds修改之後sds的len將變成30mb,那麼會分配1mb的未使用空間。sds陣列的實際長充為:30mb+1mb+1byte

惰性空間釋放:

sds的長度縮短,記憶體分配的空間不會發生變化,sds的惰性空間策略避免了記憶體重新分配操作,並為將來的可能的增長操作提供了優化,api也提供了釋放未使空間,所以不用擔心空間的浪費

④ 二進位制安全

c字串除了字串的未尾之外,字串裡面不能包含空字元,否則最先被程式讀入的空間將被誤認為是字串結尾,這些限制了c字串只能儲存文字資料。

sds則沒有這種限制,可以儲存文字或者二進位制資料

Redis慢查詢日誌

於 1 傳送命令 2 命令排隊 3 命令執行 4 返回結果 注意 慢查詢只統計步驟3的時間,所以沒有慢查詢並不代表客戶端沒有超時問題。換句話說。redis的慢查詢記錄時間指的是不包括像客戶端響應 傳送回覆等io操作,而單單是執行乙個查詢命令所耗費的時間。config setslowlog log s...

redis慢查詢日誌

許多儲存系統 如 mysql 提供慢查詢日誌幫助開發與運維人員定位系統存在的慢操作.所謂慢查詢日誌就是系統在命令執行前後計算每條命令的執行時間,當超過預設閾值,就將這條命令的相關資訊 例如 發生時間,耗時,命令的詳細資訊 記錄到慢查詢日誌中,redis也提供了類似的功能.slowlog get n ...

Redis 慢日誌查詢

連線 redis cli h host p port a password 認證 redis 127.0.0.1 6379 auth password ok redis 127.0.0.1 6379 ping pong 檢視慢日誌引數 config get slowlog 127.0.0.1 637...