Redis慢查詢?nèi)罩炯奥樵兎治鲈斀?/h1>
更新時間:2023年01月28日 14:50:45 作者:洛神灬殤
這篇文章主要為大家介紹了Redis慢查詢?nèi)罩炯奥樵兎治鲈斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
前提介紹
本篇文章主要介紹了Redis的執(zhí)行的慢查詢的功能的查詢和配置功能,從而可以方便我們在實際工作中,進行分析Redis的性能運行狀況以及對應的優(yōu)化Redis性能的佐證和指標因素。
在我們5.0左右的版本中Redis使用單線程架構(gòu)和I/O多路復用模型來實現(xiàn)高性能的內(nèi)存數(shù)據(jù)服務。接下來主要分析Redis單線程命令處理機制,接著分析Redis單線程模型為什么性能如此之高。
單線程命令的處理機制
Redis客戶端與服務端的模型主要是下圖所示。

每次客戶端調(diào)用都經(jīng)歷了發(fā)送命令、執(zhí)行命令、返回結(jié)果三個過程。
本章內(nèi)容
本章的文章內(nèi)容主要是一下幾點。

什么是慢查詢
慢查詢就是當Redis在處理一條指令的時候,當超過了系統(tǒng)配置的執(zhí)行時間的閾值的時候,就會被系統(tǒng)當作慢查詢統(tǒng)計和判定。
慢查詢?nèi)罩?/h3>
慢查詢?nèi)罩揪褪窍到y(tǒng)在命令執(zhí)行前后計算每條命令的執(zhí)行時間,當超過預設閾值,就將這條命令的相關(guān)信息(例如:發(fā)生時間、耗時、命令的詳細信息)記錄下來。
Redis慢查詢?nèi)罩?/h3>
Redis慢查詢?nèi)罩竟δ苁怯糜谟涗泩?zhí)行時間超過給定時長的命令請求,可以通過查看慢查詢?nèi)罩緛肀O(jiān)控和優(yōu)化查詢速度。
Redis慢查詢的危害
說到了Redis慢查詢的危害,就會先說一下Redis的運行機制。
Redis客戶端執(zhí)行一條命令的步驟
Redis是單線程來處理命令,所以一條命令從客戶端到達服務端不會立即被執(zhí)行,所有的命令都會進入一個隊列,然后逐個被執(zhí)行。

因此Redis服務端去執(zhí)行操作的是可以主要以下幾個步驟:

所有的指令都有先后順序,但是真正意義到達服務端的執(zhí)行順序也是不確定的,因為中間有網(wǎng)絡傳輸。但是可以肯定的是,不會有兩條命令被同時執(zhí)行,這樣就不會產(chǎn)生并發(fā)問題,這就是Redis單線程的基本模型。
慢查詢引發(fā)的問題
- 單線程機制:所有命令放在一個隊列中
- Redis執(zhí)行指令主要是在內(nèi)存中執(zhí)行、非IO阻塞、避免線程切換和競態(tài)產(chǎn)生的消耗。
因為單線程的問題,一個命令不能執(zhí)行太長時間,不然會阻塞其他命令的執(zhí)行。所以慢查詢會造成整體的Redis服務的性能的下降以及CPU的耗時和負載變高。
注意:慢查詢只會記錄執(zhí)行命令的時間,沒有慢查詢并不代表客戶端沒有超時問題。
閾值和慢查詢的日志的設置
監(jiān)控Redis指令的慢查詢功能,需要明確兩件事:
- 預設閾值怎么設置?
- 慢查詢記錄存放在哪里?
針對于慢查詢的閾值,在Redis提供了slowlog-log-slower-than
和slowlog-max-len
配置來解決這兩個問題。
閾值參數(shù)設置
慢查詢執(zhí)行時間閾值
- slowlog-log-slower-than:指定執(zhí)行時間超過多少微秒的命令會被記錄到日志上,它的單位是微妙(1秒=1000毫秒=1000000微秒),默認值10000。
例如,該值設為100,執(zhí)行了一條很慢的命令(例如 keys * ),如果它的執(zhí)行時間超過了100微秒,則這個命令會被記錄到慢查詢?nèi)罩局小?/p>
慢查詢數(shù)據(jù)存儲閾值
慢查詢?nèi)罩咀疃啻鎯Χ嗌贄l,并沒有說明存放在那里?主要通過slowlog-max-len進行控制和設置。從底層角度分析,Redis使用了一個列表來存儲慢查詢?nèi)罩?,slowlog-max-log就是列表的最大長度。
- slowlog-max-len:指定服務器上最多保存慢查詢?nèi)罩镜臈l數(shù)。
- slowlog-log-slower-than=0,那么系統(tǒng)會記錄所有的命令
- slowlog-log-slower-than<0,那么對任何命令都不會記錄。
例如,該值設為5,那么命令執(zhí)行時間超過slowlog-log-slower-than設置的時間的命令會被記錄到慢查詢?nèi)罩旧?,如果慢查詢?nèi)罩镜臄?shù)量等于5,那么再添加慢查詢?nèi)罩緯r,需要把最早添加的慢查詢?nèi)罩緞h除,即慢查詢?nèi)罩緞h除采用先進先出的方式。
慢查詢的配置類型和方式
Redis有兩種修改配置的方法:1. 修改配置文件;2. config set命令動態(tài)修改。
例如,使用config set命令將slowlog-log-slower-than設置為20000微秒,slowlog-max-len設置為10000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 10000
config rewrite
如果要Redis將配置持久化到本地配置文件,要執(zhí)行config rewrite命令,它會重寫配置文件。
慢查詢?nèi)罩镜牟僮髅?/h2>
慢查詢?nèi)罩镜牡牟樵兒途S護主要是通過:slowlog get、slowlog len、slowlog reset這幾條命令。
slowlog get [n]
慢查詢?nèi)罩居?個屬性組成:日志id、發(fā)生時間戳、命令耗時、執(zhí)行命令和參數(shù)。
127.0.0.1:6379> slowlog get
1) 1) (integer) 1
2) (integer) 1513709400
3) (integer) 11
4) 1) "slowlog"
2) "get"
2) 1) (integer) 0
2) (integer) 1513709398
3) (integer) 4
4) 1) "config"
2) "set"
3) "slowlog-log-slower-than"
4) "2"
slowlog len
獲取慢查詢?nèi)罩玖斜懋斍暗拈L度
127.0.0.1:6379> slowlog len
(integer) 2
上面則說明當前的滿查詢列表中至于連個慢查詢?nèi)罩尽?/p>
slowlog reset
實際是對慢查詢?nèi)罩玖斜碜銮謇聿僮鳌?/p>
127.0.0.1:6379> slowlog len
(integer) 6
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 1
為什么還有1個,因為閾值設的比較小,slowlog reset就屬于慢查詢。
以上就是Redis慢查詢?nèi)罩炯奥樵兎治鲈斀獾脑敿殐?nèi)容,更多關(guān)于Redis慢查詢?nèi)罩痉治龅馁Y料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
-
Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性
本文主要介紹了Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下 2022-03-03
-
使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法
由于Redis是內(nèi)存數(shù)據(jù)庫,因此可能會存在一些安全問題,下面這篇文章主要給大家介紹了關(guān)于使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下 2024-02-02
最新評論
前提介紹
本篇文章主要介紹了Redis的執(zhí)行的慢查詢的功能的查詢和配置功能,從而可以方便我們在實際工作中,進行分析Redis的性能運行狀況以及對應的優(yōu)化Redis性能的佐證和指標因素。
在我們5.0左右的版本中Redis使用單線程架構(gòu)和I/O多路復用模型來實現(xiàn)高性能的內(nèi)存數(shù)據(jù)服務。接下來主要分析Redis單線程命令處理機制,接著分析Redis單線程模型為什么性能如此之高。
單線程命令的處理機制
Redis客戶端與服務端的模型主要是下圖所示。
每次客戶端調(diào)用都經(jīng)歷了發(fā)送命令、執(zhí)行命令、返回結(jié)果三個過程。
本章內(nèi)容
本章的文章內(nèi)容主要是一下幾點。
什么是慢查詢
慢查詢就是當Redis在處理一條指令的時候,當超過了系統(tǒng)配置的執(zhí)行時間的閾值的時候,就會被系統(tǒng)當作慢查詢統(tǒng)計和判定。
慢查詢?nèi)罩?/h3>
慢查詢?nèi)罩揪褪窍到y(tǒng)在命令執(zhí)行前后計算每條命令的執(zhí)行時間,當超過預設閾值,就將這條命令的相關(guān)信息(例如:發(fā)生時間、耗時、命令的詳細信息)記錄下來。
Redis慢查詢?nèi)罩?/h3>
Redis慢查詢?nèi)罩竟δ苁怯糜谟涗泩?zhí)行時間超過給定時長的命令請求,可以通過查看慢查詢?nèi)罩緛肀O(jiān)控和優(yōu)化查詢速度。
Redis慢查詢的危害
說到了Redis慢查詢的危害,就會先說一下Redis的運行機制。
Redis客戶端執(zhí)行一條命令的步驟
Redis是單線程來處理命令,所以一條命令從客戶端到達服務端不會立即被執(zhí)行,所有的命令都會進入一個隊列,然后逐個被執(zhí)行。
因此Redis服務端去執(zhí)行操作的是可以主要以下幾個步驟:
所有的指令都有先后順序,但是真正意義到達服務端的執(zhí)行順序也是不確定的,因為中間有網(wǎng)絡傳輸。但是可以肯定的是,不會有兩條命令被同時執(zhí)行,這樣就不會產(chǎn)生并發(fā)問題,這就是Redis單線程的基本模型。
慢查詢引發(fā)的問題
- 單線程機制:所有命令放在一個隊列中
- Redis執(zhí)行指令主要是在內(nèi)存中執(zhí)行、非IO阻塞、避免線程切換和競態(tài)產(chǎn)生的消耗。
因為單線程的問題,一個命令不能執(zhí)行太長時間,不然會阻塞其他命令的執(zhí)行。所以慢查詢會造成整體的Redis服務的性能的下降以及CPU的耗時和負載變高。
注意:慢查詢只會記錄執(zhí)行命令的時間,沒有慢查詢并不代表客戶端沒有超時問題。
閾值和慢查詢的日志的設置
監(jiān)控Redis指令的慢查詢功能,需要明確兩件事:
- 預設閾值怎么設置?
- 慢查詢記錄存放在哪里?
針對于慢查詢的閾值,在Redis提供了slowlog-log-slower-than
和slowlog-max-len
配置來解決這兩個問題。
閾值參數(shù)設置
慢查詢執(zhí)行時間閾值
- slowlog-log-slower-than:指定執(zhí)行時間超過多少微秒的命令會被記錄到日志上,它的單位是微妙(1秒=1000毫秒=1000000微秒),默認值10000。
例如,該值設為100,執(zhí)行了一條很慢的命令(例如 keys * ),如果它的執(zhí)行時間超過了100微秒,則這個命令會被記錄到慢查詢?nèi)罩局小?/p>
慢查詢數(shù)據(jù)存儲閾值
慢查詢?nèi)罩咀疃啻鎯Χ嗌贄l,并沒有說明存放在那里?主要通過slowlog-max-len進行控制和設置。從底層角度分析,Redis使用了一個列表來存儲慢查詢?nèi)罩?,slowlog-max-log就是列表的最大長度。
- slowlog-max-len:指定服務器上最多保存慢查詢?nèi)罩镜臈l數(shù)。
- slowlog-log-slower-than=0,那么系統(tǒng)會記錄所有的命令
- slowlog-log-slower-than<0,那么對任何命令都不會記錄。
例如,該值設為5,那么命令執(zhí)行時間超過slowlog-log-slower-than設置的時間的命令會被記錄到慢查詢?nèi)罩旧?,如果慢查詢?nèi)罩镜臄?shù)量等于5,那么再添加慢查詢?nèi)罩緯r,需要把最早添加的慢查詢?nèi)罩緞h除,即慢查詢?nèi)罩緞h除采用先進先出的方式。
慢查詢的配置類型和方式
Redis有兩種修改配置的方法:1. 修改配置文件;2. config set命令動態(tài)修改。
例如,使用config set命令將slowlog-log-slower-than設置為20000微秒,slowlog-max-len設置為10000:
config set slowlog-log-slower-than 20000 config set slowlog-max-len 10000 config rewrite
如果要Redis將配置持久化到本地配置文件,要執(zhí)行config rewrite命令,它會重寫配置文件。
慢查詢?nèi)罩镜牟僮髅?/h2>
慢查詢?nèi)罩镜牡牟樵兒途S護主要是通過:slowlog get、slowlog len、slowlog reset這幾條命令。
slowlog get [n]
慢查詢?nèi)罩居?個屬性組成:日志id、發(fā)生時間戳、命令耗時、執(zhí)行命令和參數(shù)。
127.0.0.1:6379> slowlog get 1) 1) (integer) 1 2) (integer) 1513709400 3) (integer) 11 4) 1) "slowlog" 2) "get" 2) 1) (integer) 0 2) (integer) 1513709398 3) (integer) 4 4) 1) "config" 2) "set" 3) "slowlog-log-slower-than" 4) "2"
slowlog len
獲取慢查詢?nèi)罩玖斜懋斍暗拈L度
127.0.0.1:6379> slowlog len (integer) 2
上面則說明當前的滿查詢列表中至于連個慢查詢?nèi)罩尽?/p>
slowlog reset
實際是對慢查詢?nèi)罩玖斜碜銮謇聿僮鳌?/p>
127.0.0.1:6379> slowlog len (integer) 6 127.0.0.1:6379> slowlog reset OK 127.0.0.1:6379> slowlog len (integer) 1
為什么還有1個,因為閾值設的比較小,slowlog reset就屬于慢查詢。
以上就是Redis慢查詢?nèi)罩炯奥樵兎治鲈斀獾脑敿殐?nèi)容,更多關(guān)于Redis慢查詢?nèi)罩痉治龅馁Y料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性
本文主要介紹了Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法
由于Redis是內(nèi)存數(shù)據(jù)庫,因此可能會存在一些安全問題,下面這篇文章主要給大家介紹了關(guān)于使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-02-02