最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Redis常見延遲問題定位與分析

 更新時(shí)間:2022年06月09日 11:44:13   作者:知知之之  
大部分時(shí)候,redis延遲很低,但是在某些時(shí)刻,有些redis實(shí)例會(huì)出現(xiàn)很高的響應(yīng)延時(shí),本文主要介紹了淺談Redis常見延遲問題定位與分析,具有一定的參考價(jià)值,感興趣的可以了解一下

使用復(fù)雜度高的命令

如果在使用Redis時(shí),發(fā)現(xiàn)訪問延遲突然增大,如何進(jìn)行排查?

首先,第一步,建議你去查看一下Redis的慢日志。Redis提供了慢日志命令的統(tǒng)計(jì)功能,我們通過以下設(shè)置,就可以查看有哪些命令在執(zhí)行時(shí)延遲比較大。

首先設(shè)置Redis的慢日志閾值,只有超過閾值的命令才會(huì)被記錄,這里的單位是微妙,例如設(shè)置慢日志的閾值為5毫秒,同時(shí)設(shè)置只保留最近1000條慢日志記錄:

# 命令執(zhí)行超過5毫秒記錄慢日志
CONFIG SET slowlog-log-slower-than 5000
# 只保留最近1000條慢日志
CONFIG SET slowlog-max-len 1000

設(shè)置完成之后,所有執(zhí)行的命令如果延遲大于5毫秒,都會(huì)被Redis記錄下來,我們執(zhí)行SLOWLOG get 5查詢最近5條慢日志:

127.0.0.1:6379> SLOWLOG get 5
1) 1) (integer) 32693       # 慢日志ID
   2) (integer) 1593763337  # 執(zhí)行時(shí)間
   3) (integer) 5299        # 執(zhí)行耗時(shí)(微妙)
   4) 1) "LRANGE"           # 具體執(zhí)行的命令和參數(shù)
      2) "user_list_2000"
      3) "0"
      4) "-1"
2) 1) (integer) 32692
   2) (integer) 1593763337
   3) (integer) 5044
   4) 1) "GET"
      2) "book_price_1000"
...

通過查看慢日志記錄,我們就可以知道在什么時(shí)間執(zhí)行哪些命令比較耗時(shí),如果你的業(yè)務(wù)經(jīng)常使用O(N)以上復(fù)雜度的命令,例如sort、sunion、zunionstore、keys、scan,或者在執(zhí)行O(N)命令時(shí)操作的數(shù)據(jù)量比較大,這些情況下Redis處理數(shù)據(jù)時(shí)就會(huì)很耗時(shí)。

如果你的服務(wù)請求量并不大,但Redis實(shí)例的CPU使用率很高,很有可能是使用了復(fù)雜度高的命令導(dǎo)致的。

解決方案就是,不使用這些復(fù)雜度較高的命令,并且一次不要獲取太多的數(shù)據(jù),每次盡量操作少量的數(shù)據(jù),讓Redis可以及時(shí)處理返回。

存儲bigkey

如果查詢慢日志發(fā)現(xiàn),并不是復(fù)雜度較高的命令導(dǎo)致的,例如都是SET、DELETE操作出現(xiàn)在慢日志記錄中,那么你就要懷疑是否存在Redis寫入了bigkey的情況。

Redis在寫入數(shù)據(jù)時(shí),需要為新的數(shù)據(jù)分配內(nèi)存,當(dāng)從Redis中刪除數(shù)據(jù)時(shí),它會(huì)釋放對應(yīng)的內(nèi)存空間。

如果一個(gè)key寫入的數(shù)據(jù)非常大,Redis在分配內(nèi)存時(shí)也會(huì)比較耗時(shí)。同樣的,當(dāng)刪除這個(gè)key的數(shù)據(jù)時(shí),釋放內(nèi)存也會(huì)耗時(shí)比較久。

你需要檢查你的業(yè)務(wù)代碼,是否存在寫入bigkey的情況,需要評估寫入數(shù)據(jù)量的大小,業(yè)務(wù)層應(yīng)該避免一個(gè)key存入過大的數(shù)據(jù)量。

針對bigkey的問題,Redis官方在4.0版本推出了lazy-free的機(jī)制,用于異步釋放bigkey的內(nèi)存,降低對Redis性能的影響。即使這樣,我們也不建議使用bigkey,bigkey在集群的遷移過程中,也會(huì)影響到遷移的性能,這個(gè)后面在介紹集群相關(guān)的文章時(shí),會(huì)再詳細(xì)介紹到。

集中過期

有時(shí)你會(huì)發(fā)現(xiàn),平時(shí)在使用Redis時(shí)沒有延時(shí)比較大的情況,但在某個(gè)時(shí)間點(diǎn)突然出現(xiàn)一波延時(shí),而且報(bào)慢的時(shí)間點(diǎn)很有規(guī)律,例如某個(gè)整點(diǎn),或者間隔多久就會(huì)發(fā)生一次。

如果出現(xiàn)這種情況,就需要考慮是否存在大量key集中過期的情況。

如果有大量的key在某個(gè)固定時(shí)間點(diǎn)集中過期,在這個(gè)時(shí)間點(diǎn)訪問Redis時(shí),就有可能導(dǎo)致延遲增加。

Redis的過期策略采用定期刪除+惰性刪除兩種策略;

注意,Redis的定期刪除的定時(shí)任務(wù),也是在Redis主線程中執(zhí)行的,也就是說如果在執(zhí)行主動(dòng)過期的過程中,出現(xiàn)了需要大量刪除過期key的情況,那么在業(yè)務(wù)訪問時(shí),必須等這個(gè)過期任務(wù)執(zhí)行結(jié)束,才可以處理業(yè)務(wù)請求。此時(shí)就會(huì)出現(xiàn),業(yè)務(wù)訪問延時(shí)增大的問題,最大延遲為25毫秒。

而且這個(gè)訪問延遲的情況,不會(huì)記錄在慢日志里。慢日志中只記錄真正執(zhí)行某個(gè)命令的耗時(shí),Redis主動(dòng)過期策略執(zhí)行在操作命令之前,如果操作命令耗時(shí)達(dá)不到慢日志閾值,它是不會(huì)計(jì)算在慢日志統(tǒng)計(jì)中的,但我們的業(yè)務(wù)卻感到了延遲增大。

解決方案是,在集中過期時(shí)增加一個(gè)隨機(jī)時(shí)間,把這些需要過期的key的時(shí)間打散即可。

實(shí)例內(nèi)存達(dá)到上限

有時(shí)我們把Redis當(dāng)做純緩存使用,就會(huì)給實(shí)例設(shè)置一個(gè)內(nèi)存上限maxmemory,然后開啟LRU淘汰策略。

當(dāng)實(shí)例的內(nèi)存達(dá)到了maxmemory后,你會(huì)發(fā)現(xiàn)之后的每次寫入新的數(shù)據(jù),有可能變慢了。

導(dǎo)致變慢的原因是,當(dāng)Redis內(nèi)存達(dá)到maxmemory后,每次寫入新的數(shù)據(jù)之前,必須先踢出一部分?jǐn)?shù)據(jù),讓內(nèi)存維持在maxmemory之下。

這個(gè)踢出舊數(shù)據(jù)的邏輯也是需要消耗時(shí)間的,而具體耗時(shí)的長短,要取決于配置的淘汰策略

fork耗時(shí)嚴(yán)重

如果你的Redis開啟了自動(dòng)生成RDB和AOF重寫功能,那么有可能在后臺生成RDB和AOF重寫時(shí)導(dǎo)致Redis的訪問延遲增大,而等這些任務(wù)執(zhí)行完畢后,延遲情況消失。

遇到這種情況,一般就是執(zhí)行生成RDB和AOF重寫任務(wù)導(dǎo)致的。

生成RDB和AOF都需要父進(jìn)程fork出一個(gè)子進(jìn)程進(jìn)行數(shù)據(jù)的持久化,在fork執(zhí)行過程中,父進(jìn)程需要拷貝內(nèi)存頁表給子進(jìn)程,如果整個(gè)實(shí)例內(nèi)存占用很大,那么需要拷貝的內(nèi)存頁表會(huì)比較耗時(shí),此過程會(huì)消耗大量的CPU資源,在完成fork之前,整個(gè)實(shí)例會(huì)被阻塞住,無法處理任何請求,如果此時(shí)CPU資源緊張,那么fork的時(shí)間會(huì)更長,甚至達(dá)到秒級。這會(huì)嚴(yán)重影響Redis的性能。

綁定CPU

很多時(shí)候,我們在部署服務(wù)時(shí),為了提高性能,降低程序在使用多個(gè)CPU時(shí)上下文切換的性能損耗,一般會(huì)采用進(jìn)程綁定CPU的操作。

但在使用Redis時(shí),我們不建議這么干,原因如下。

綁定CPU的Redis,在進(jìn)行數(shù)據(jù)持久化時(shí),fork出的子進(jìn)程,子進(jìn)程會(huì)繼承父進(jìn)程的CPU使用偏好,而此時(shí)子進(jìn)程會(huì)消耗大量的CPU資源進(jìn)行數(shù)據(jù)持久化,子進(jìn)程會(huì)與主進(jìn)程發(fā)生CPU爭搶,這也會(huì)導(dǎo)致主進(jìn)程的CPU資源不足訪問延遲增大。

所以在部署Redis進(jìn)程時(shí),如果需要開啟RDB和AOF重寫機(jī)制,一定不能進(jìn)行CPU綁定操作

使用Swap

如果你發(fā)現(xiàn)Redis突然變得非常慢,每次訪問的耗時(shí)都達(dá)到了幾百毫秒甚至秒級,那此時(shí)就檢查Redis是否使用到了Swap,這種情況下Redis基本上已經(jīng)無法提供高性能的服務(wù)。

我們知道,操作系統(tǒng)提供了Swap機(jī)制,目的是為了當(dāng)內(nèi)存不足時(shí),可以把一部分內(nèi)存中的數(shù)據(jù)換到磁盤上,以達(dá)到對內(nèi)存使用的緩沖。

但當(dāng)內(nèi)存中的數(shù)據(jù)被換到磁盤上后,訪問這些數(shù)據(jù)就需要從磁盤中讀取,這個(gè)速度要比內(nèi)存慢太多!

尤其是針對Redis這種高性能的內(nèi)存數(shù)據(jù)庫來說,如果Redis中的內(nèi)存被換到磁盤上,對于Redis這種性能極其敏感的數(shù)據(jù)庫,這個(gè)操作時(shí)間是無法接受的??梢耘R時(shí)關(guān)閉操作系統(tǒng)Swap

網(wǎng)卡負(fù)載過高

特點(diǎn)就是從某個(gè)時(shí)間點(diǎn)之后就開始變慢,并且一直持續(xù)。這時(shí)你需要檢查一下機(jī)器的網(wǎng)卡流量,是否存在網(wǎng)卡流量被跑滿的情況。

網(wǎng)卡負(fù)載過高,在網(wǎng)絡(luò)層和TCP層就會(huì)出現(xiàn)數(shù)據(jù)發(fā)送延遲、數(shù)據(jù)丟包等情況。Redis的高性能除了內(nèi)存之外,就在于網(wǎng)絡(luò)IO,請求量突增會(huì)導(dǎo)致網(wǎng)卡負(fù)載變高。

如果出現(xiàn)這種情況,你需要排查這個(gè)機(jī)器上的哪個(gè)Redis實(shí)例的流量過大占滿了網(wǎng)絡(luò)帶寬,然后確認(rèn)流量突增是否屬于業(yè)務(wù)正常情況,如果屬于那就需要及時(shí)擴(kuò)容或遷移實(shí)例,避免這個(gè)機(jī)器的其他實(shí)例受到影響。

到此這篇關(guān)于淺談Redis常見延遲問題定位與分析的文章就介紹到這了,更多相關(guān)Redis 延遲問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis數(shù)據(jù)備份與恢復(fù)方式的五種方式

    Redis數(shù)據(jù)備份與恢復(fù)方式的五種方式

    本文主要介紹了Redis數(shù)據(jù)備份與恢復(fù)方式,包含了五種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Redis安全策略詳解

    Redis安全策略詳解

    緩存穿透是指當(dāng)用戶在查詢一條數(shù)據(jù)的時(shí)候,而此時(shí)數(shù)據(jù)庫和緩存卻沒有關(guān)于這條數(shù)據(jù)的任何記錄,而這條數(shù)據(jù)在緩存中沒找到就會(huì)向數(shù)據(jù)庫請求獲取數(shù)據(jù)。用戶拿不到數(shù)據(jù)時(shí),就會(huì)一直發(fā)請求,查詢數(shù)據(jù)庫,這樣會(huì)對數(shù)據(jù)庫的訪問造成很大的壓力
    2022-07-07
  • 詳解Redis實(shí)現(xiàn)分布式鎖的原理

    詳解Redis實(shí)現(xiàn)分布式鎖的原理

    分布式鎖,即分布式系統(tǒng)中的鎖,在單體應(yīng)用中我們通過鎖解決的是控制共享資源訪問的問題,而分布式鎖,就是解決了分布式系統(tǒng)中控制共享資源訪問的問題,本文講給大家詳細(xì)介紹一下Redis實(shí)現(xiàn)分布式鎖的原理,需要的朋友可以參考下
    2023-09-09
  • Redis中pipeline(管道)的實(shí)現(xiàn)示例

    Redis中pipeline(管道)的實(shí)現(xiàn)示例

    Redis管道(Pipeline)技術(shù)是一種提高數(shù)據(jù)處理效率的機(jī)制,允許客戶端通過一次網(wǎng)絡(luò)往返(RTT)發(fā)送多個(gè)命令到服務(wù)端,并一次性接收所有響應(yīng),本文就來實(shí)現(xiàn)管道,感興趣的可以了解一下
    2024-10-10
  • Redis一鍵巡檢腳本的實(shí)現(xiàn)

    Redis一鍵巡檢腳本的實(shí)現(xiàn)

    在使用Redis作為數(shù)據(jù)存儲的時(shí)候,定期進(jìn)行巡檢是非常重要的,本文主要介紹了Redis一鍵巡檢腳本的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 詳解Redis如何保證接口的冪等性

    詳解Redis如何保證接口的冪等性

    如何防止接口中同樣的數(shù)據(jù)提交,以及如何保證消息不被重復(fù)消費(fèi),這些都是shigen在學(xué)習(xí)的過程中遇到的問題,今天,趁著在學(xué)習(xí)redis的間隙,我寫了一篇文章進(jìn)行簡單的實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11
  • Redis哨兵監(jiān)控的使用

    Redis哨兵監(jiān)控的使用

    在Redis集群模式中,哨兵模式是一種常用的方案,本文主要介紹了Redis哨兵監(jiān)控的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解

    小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解

    這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 關(guān)于分布式鎖的三種實(shí)現(xiàn)方式

    關(guān)于分布式鎖的三種實(shí)現(xiàn)方式

    這篇文章主要介紹了關(guān)于分布式鎖的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Redis搶單預(yù)熱的實(shí)現(xiàn)示例

    Redis搶單預(yù)熱的實(shí)現(xiàn)示例

    本文主要介紹了Redis搶單預(yù)熱的實(shí)現(xiàn)示例,以應(yīng)對搶單活動(dòng)帶來的高并發(fā)訪問壓力,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11

最新評論

沐川县| 山西省| 项城市| 武强县| 香格里拉县| 淮阳县| 揭阳市| 准格尔旗| 织金县| 彝良县| 盘锦市| 平阳县| 闻喜县| 莱州市| 秦皇岛市| 太和县| 中西区| 万宁市| 杭锦后旗| 武隆县| 宁波市| 田林县| 县级市| 盐源县| 金门县| 巴里| 漳浦县| 怀仁县| 五河县| 绥化市| 阿图什市| 班玛县| 兰西县| 裕民县| 武鸣县| 唐山市| 海淀区| 昌宁县| 肇东市| 常宁市| 西藏|