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

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

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

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

所有的指令都有先后順序,但是真正意義到達(dá)服務(wù)端的執(zhí)行順序也是不確定的,因?yàn)橹虚g有網(wǎng)絡(luò)傳輸。但是可以肯定的是,不會(huì)有兩條命令被同時(shí)執(zhí)行,這樣就不會(huì)產(chǎn)生并發(fā)問(wèn)題,這就是Redis單線程的基本模型。
慢查詢引發(fā)的問(wèn)題
- 單線程機(jī)制:所有命令放在一個(gè)隊(duì)列中
- Redis執(zhí)行指令主要是在內(nèi)存中執(zhí)行、非IO阻塞、避免線程切換和競(jìng)態(tài)產(chǎn)生的消耗。
因?yàn)閱尉€程的問(wèn)題,一個(gè)命令不能執(zhí)行太長(zhǎng)時(shí)間,不然會(huì)阻塞其他命令的執(zhí)行。所以慢查詢會(huì)造成整體的Redis服務(wù)的性能的下降以及CPU的耗時(shí)和負(fù)載變高。
注意:慢查詢只會(huì)記錄執(zhí)行命令的時(shí)間,沒(méi)有慢查詢并不代表客戶端沒(méi)有超時(shí)問(wèn)題。
閾值和慢查詢的日志的設(shè)置
監(jiān)控Redis指令的慢查詢功能,需要明確兩件事:
- 預(yù)設(shè)閾值怎么設(shè)置?
- 慢查詢記錄存放在哪里?
針對(duì)于慢查詢的閾值,在Redis提供了slowlog-log-slower-than和slowlog-max-len配置來(lái)解決這兩個(gè)問(wèn)題。
閾值參數(shù)設(shè)置
慢查詢執(zhí)行時(shí)間閾值
- slowlog-log-slower-than:指定執(zhí)行時(shí)間超過(guò)多少微秒的命令會(huì)被記錄到日志上,它的單位是微妙(1秒=1000毫秒=1000000微秒),默認(rèn)值10000。
例如,該值設(shè)為100,執(zhí)行了一條很慢的命令(例如 keys * ),如果它的執(zhí)行時(shí)間超過(guò)了100微秒,則這個(gè)命令會(huì)被記錄到慢查詢?nèi)罩局小?/p>
慢查詢數(shù)據(jù)存儲(chǔ)閾值
慢查詢?nèi)罩咀疃啻鎯?chǔ)多少條,并沒(méi)有說(shuō)明存放在那里?主要通過(guò)slowlog-max-len進(jìn)行控制和設(shè)置。從底層角度分析,Redis使用了一個(gè)列表來(lái)存儲(chǔ)慢查詢?nèi)罩?,slowlog-max-log就是列表的最大長(zhǎng)度。
- slowlog-max-len:指定服務(wù)器上最多保存慢查詢?nèi)罩镜臈l數(shù)。
- slowlog-log-slower-than=0,那么系統(tǒng)會(huì)記錄所有的命令
- slowlog-log-slower-than<0,那么對(duì)任何命令都不會(huì)記錄。
例如,該值設(shè)為5,那么命令執(zhí)行時(shí)間超過(guò)slowlog-log-slower-than設(shè)置的時(shí)間的命令會(huì)被記錄到慢查詢?nèi)罩旧?,如果慢查詢?nèi)罩镜臄?shù)量等于5,那么再添加慢查詢?nèi)罩緯r(shí),需要把最早添加的慢查詢?nèi)罩緞h除,即慢查詢?nèi)罩緞h除采用先進(jìn)先出的方式。
慢查詢的配置類型和方式
Redis有兩種修改配置的方法:1. 修改配置文件;2. config set命令動(dòng)態(tài)修改。
例如,使用config set命令將slowlog-log-slower-than設(shè)置為20000微秒,slowlog-max-len設(shè)置為10000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 10000
config rewrite
如果要Redis將配置持久化到本地配置文件,要執(zhí)行config rewrite命令,它會(huì)重寫配置文件。
慢查詢?nèi)罩镜牟僮髅?/h2>
慢查詢?nèi)罩镜牡牟樵兒途S護(hù)主要是通過(guò):slowlog get、slowlog len、slowlog reset這幾條命令。
slowlog get [n]
慢查詢?nèi)罩居?個(gè)屬性組成:日志id、發(fā)生時(shí)間戳、命令耗時(shí)、執(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)罩玖斜懋?dāng)前的長(zhǎng)度
127.0.0.1:6379> slowlog len
(integer) 2
上面則說(shuō)明當(dāng)前的滿查詢列表中至于連個(gè)慢查詢?nèi)罩尽?/p>
slowlog reset
實(shí)際是對(duì)慢查詢?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個(gè),因?yàn)殚撝翟O(shè)的比較小,slowlog reset就屬于慢查詢。
以上就是Redis慢查詢?nèi)罩炯奥樵兎治鲈斀獾脑敿?xì)內(nèi)容,更多關(guān)于Redis慢查詢?nèi)罩痉治龅馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
-
Redis中的數(shù)據(jù)結(jié)構(gòu)跳表詳解
跳表是一種基于并聯(lián)的鏈表結(jié)構(gòu),用于在有序元素序列中快速查找元素的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹Redis中的數(shù)據(jù)結(jié)構(gòu)跳表,感興趣的朋友跟隨小編一起看看吧 2024-06-06
-
Linux環(huán)境下升級(jí)redis的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下升級(jí)redis的詳細(xì)步驟,描述了如何從舊版本升級(jí)到新版本Redis,包括備份舊數(shù)據(jù)、下載和安裝新版本、復(fù)制配置文件和數(shù)據(jù)、停止舊版本并啟動(dòng)新版本的過(guò)程,需要的朋友可以參考下 2024-12-12
-
Redis實(shí)現(xiàn)延遲隊(duì)列的項(xiàng)目示例
延遲隊(duì)列是Redis的一個(gè)重要應(yīng)用場(chǎng)景,本文主要介紹了Redis實(shí)現(xiàn)延遲隊(duì)列的項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2024-06-06
-
Redis 的各項(xiàng)功能主要解決了什么問(wèn)題
Redis是一個(gè)基于BSD開源的項(xiàng)目,是一個(gè)把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個(gè)存儲(chǔ)系統(tǒng),你可以把它作為數(shù)據(jù)庫(kù),緩存和消息中間件來(lái)使用。這篇文章主要介紹了Redis 的各項(xiàng)功能主要解決了什么問(wèn)題,需要的朋友可以參考下 2018-10-10
-
Redis中的3種特殊數(shù)據(jù)結(jié)構(gòu)詳解
在本文中,我們對(duì)三種特殊的數(shù)據(jù)類型進(jìn)行了介紹,它們分別是geospatial(地理空間數(shù)據(jù)類型)、HyperLogLogs和Bitmaps(位圖),這些數(shù)據(jù)類型在不同的領(lǐng)域和應(yīng)用中發(fā)揮著重要作用,并且具有各自獨(dú)特的特性和用途,對(duì)Redis特殊數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧 2024-02-02
-
redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹
本文主要向大家介紹了redis實(shí)現(xiàn)計(jì)數(shù)器防止刷單的方法和有關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。 2017-11-11
-
Redis實(shí)戰(zhàn)之百度首頁(yè)新聞熱榜的實(shí)現(xiàn)代碼
這篇文章主要介紹了Redis實(shí)戰(zhàn)之百度首頁(yè)新聞熱榜的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2021-02-02
最新評(píng)論
前提介紹
本篇文章主要介紹了Redis的執(zhí)行的慢查詢的功能的查詢和配置功能,從而可以方便我們?cè)趯?shí)際工作中,進(jìn)行分析Redis的性能運(yùn)行狀況以及對(duì)應(yīng)的優(yōu)化Redis性能的佐證和指標(biāo)因素。
在我們5.0左右的版本中Redis使用單線程架構(gòu)和I/O多路復(fù)用模型來(lái)實(shí)現(xiàn)高性能的內(nèi)存數(shù)據(jù)服務(wù)。接下來(lái)主要分析Redis單線程命令處理機(jī)制,接著分析Redis單線程模型為什么性能如此之高。
單線程命令的處理機(jī)制
Redis客戶端與服務(wù)端的模型主要是下圖所示。

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

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

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

所有的指令都有先后順序,但是真正意義到達(dá)服務(wù)端的執(zhí)行順序也是不確定的,因?yàn)橹虚g有網(wǎng)絡(luò)傳輸。但是可以肯定的是,不會(huì)有兩條命令被同時(shí)執(zhí)行,這樣就不會(huì)產(chǎn)生并發(fā)問(wèn)題,這就是Redis單線程的基本模型。
慢查詢引發(fā)的問(wèn)題
- 單線程機(jī)制:所有命令放在一個(gè)隊(duì)列中
- Redis執(zhí)行指令主要是在內(nèi)存中執(zhí)行、非IO阻塞、避免線程切換和競(jìng)態(tài)產(chǎn)生的消耗。
因?yàn)閱尉€程的問(wèn)題,一個(gè)命令不能執(zhí)行太長(zhǎng)時(shí)間,不然會(huì)阻塞其他命令的執(zhí)行。所以慢查詢會(huì)造成整體的Redis服務(wù)的性能的下降以及CPU的耗時(shí)和負(fù)載變高。
注意:慢查詢只會(huì)記錄執(zhí)行命令的時(shí)間,沒(méi)有慢查詢并不代表客戶端沒(méi)有超時(shí)問(wèn)題。
閾值和慢查詢的日志的設(shè)置
監(jiān)控Redis指令的慢查詢功能,需要明確兩件事:
- 預(yù)設(shè)閾值怎么設(shè)置?
- 慢查詢記錄存放在哪里?
針對(duì)于慢查詢的閾值,在Redis提供了slowlog-log-slower-than和slowlog-max-len配置來(lái)解決這兩個(gè)問(wèn)題。
閾值參數(shù)設(shè)置
慢查詢執(zhí)行時(shí)間閾值
- slowlog-log-slower-than:指定執(zhí)行時(shí)間超過(guò)多少微秒的命令會(huì)被記錄到日志上,它的單位是微妙(1秒=1000毫秒=1000000微秒),默認(rèn)值10000。
例如,該值設(shè)為100,執(zhí)行了一條很慢的命令(例如 keys * ),如果它的執(zhí)行時(shí)間超過(guò)了100微秒,則這個(gè)命令會(huì)被記錄到慢查詢?nèi)罩局小?/p>
慢查詢數(shù)據(jù)存儲(chǔ)閾值
慢查詢?nèi)罩咀疃啻鎯?chǔ)多少條,并沒(méi)有說(shuō)明存放在那里?主要通過(guò)slowlog-max-len進(jìn)行控制和設(shè)置。從底層角度分析,Redis使用了一個(gè)列表來(lái)存儲(chǔ)慢查詢?nèi)罩?,slowlog-max-log就是列表的最大長(zhǎng)度。
- slowlog-max-len:指定服務(wù)器上最多保存慢查詢?nèi)罩镜臈l數(shù)。
- slowlog-log-slower-than=0,那么系統(tǒng)會(huì)記錄所有的命令
- slowlog-log-slower-than<0,那么對(duì)任何命令都不會(huì)記錄。
例如,該值設(shè)為5,那么命令執(zhí)行時(shí)間超過(guò)slowlog-log-slower-than設(shè)置的時(shí)間的命令會(huì)被記錄到慢查詢?nèi)罩旧?,如果慢查詢?nèi)罩镜臄?shù)量等于5,那么再添加慢查詢?nèi)罩緯r(shí),需要把最早添加的慢查詢?nèi)罩緞h除,即慢查詢?nèi)罩緞h除采用先進(jìn)先出的方式。
慢查詢的配置類型和方式
Redis有兩種修改配置的方法:1. 修改配置文件;2. config set命令動(dòng)態(tài)修改。
例如,使用config set命令將slowlog-log-slower-than設(shè)置為20000微秒,slowlog-max-len設(shè)置為10000:
config set slowlog-log-slower-than 20000 config set slowlog-max-len 10000 config rewrite
如果要Redis將配置持久化到本地配置文件,要執(zhí)行config rewrite命令,它會(huì)重寫配置文件。
慢查詢?nèi)罩镜牟僮髅?/h2>
慢查詢?nèi)罩镜牡牟樵兒途S護(hù)主要是通過(guò):slowlog get、slowlog len、slowlog reset這幾條命令。
slowlog get [n]
慢查詢?nèi)罩居?個(gè)屬性組成:日志id、發(fā)生時(shí)間戳、命令耗時(shí)、執(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)罩玖斜懋?dāng)前的長(zhǎng)度
127.0.0.1:6379> slowlog len (integer) 2
上面則說(shuō)明當(dāng)前的滿查詢列表中至于連個(gè)慢查詢?nèi)罩尽?/p>
slowlog reset
實(shí)際是對(duì)慢查詢?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個(gè),因?yàn)殚撝翟O(shè)的比較小,slowlog reset就屬于慢查詢。
以上就是Redis慢查詢?nèi)罩炯奥樵兎治鲈斀獾脑敿?xì)內(nèi)容,更多關(guān)于Redis慢查詢?nèi)罩痉治龅馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis中的數(shù)據(jù)結(jié)構(gòu)跳表詳解
跳表是一種基于并聯(lián)的鏈表結(jié)構(gòu),用于在有序元素序列中快速查找元素的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹Redis中的數(shù)據(jù)結(jié)構(gòu)跳表,感興趣的朋友跟隨小編一起看看吧2024-06-06
Linux環(huán)境下升級(jí)redis的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下升級(jí)redis的詳細(xì)步驟,描述了如何從舊版本升級(jí)到新版本Redis,包括備份舊數(shù)據(jù)、下載和安裝新版本、復(fù)制配置文件和數(shù)據(jù)、停止舊版本并啟動(dòng)新版本的過(guò)程,需要的朋友可以參考下2024-12-12
Redis實(shí)現(xiàn)延遲隊(duì)列的項(xiàng)目示例
延遲隊(duì)列是Redis的一個(gè)重要應(yīng)用場(chǎng)景,本文主要介紹了Redis實(shí)現(xiàn)延遲隊(duì)列的項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
Redis 的各項(xiàng)功能主要解決了什么問(wèn)題
Redis是一個(gè)基于BSD開源的項(xiàng)目,是一個(gè)把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個(gè)存儲(chǔ)系統(tǒng),你可以把它作為數(shù)據(jù)庫(kù),緩存和消息中間件來(lái)使用。這篇文章主要介紹了Redis 的各項(xiàng)功能主要解決了什么問(wèn)題,需要的朋友可以參考下2018-10-10
Redis中的3種特殊數(shù)據(jù)結(jié)構(gòu)詳解
在本文中,我們對(duì)三種特殊的數(shù)據(jù)類型進(jìn)行了介紹,它們分別是geospatial(地理空間數(shù)據(jù)類型)、HyperLogLogs和Bitmaps(位圖),這些數(shù)據(jù)類型在不同的領(lǐng)域和應(yīng)用中發(fā)揮著重要作用,并且具有各自獨(dú)特的特性和用途,對(duì)Redis特殊數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧2024-02-02
redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹
本文主要向大家介紹了redis實(shí)現(xiàn)計(jì)數(shù)器防止刷單的方法和有關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Redis實(shí)戰(zhàn)之百度首頁(yè)新聞熱榜的實(shí)現(xiàn)代碼
這篇文章主要介紹了Redis實(shí)戰(zhàn)之百度首頁(yè)新聞熱榜的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

