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

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

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

使用復雜度高的命令

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

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

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

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

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

127.0.0.1:6379> SLOWLOG get 5
1) 1) (integer) 32693       # 慢日志ID
   2) (integer) 1593763337  # 執(zhí)行時間
   3) (integer) 5299        # 執(zhí)行耗時(微妙)
   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"
...

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

如果你的服務請求量并不大,但Redis實例的CPU使用率很高,很有可能是使用了復雜度高的命令導致的。

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

存儲bigkey

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

Redis在寫入數(shù)據(jù)時,需要為新的數(shù)據(jù)分配內存,當從Redis中刪除數(shù)據(jù)時,它會釋放對應的內存空間。

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

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

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

集中過期

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

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

如果有大量的key在某個固定時間點集中過期,在這個時間點訪問Redis時,就有可能導致延遲增加。

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

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

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

解決方案是,在集中過期時增加一個隨機時間,把這些需要過期的key的時間打散即可。

實例內存達到上限

有時我們把Redis當做純緩存使用,就會給實例設置一個內存上限maxmemory,然后開啟LRU淘汰策略。

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

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

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

fork耗時嚴重

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

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

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

綁定CPU

很多時候,我們在部署服務時,為了提高性能,降低程序在使用多個CPU時上下文切換的性能損耗,一般會采用進程綁定CPU的操作。

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

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

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

使用Swap

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

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

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

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

網(wǎng)卡負載過高

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

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

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

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

相關文章

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

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

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

    Redis安全策略詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Redis搶單預熱的實現(xiàn)示例

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

最新評論

龙游县| 乐安县| 建湖县| 阳西县| 定西市| 略阳县| 富民县| 东安县| 涡阳县| 迁西县| 景泰县| 怀集县| 泰来县| 图木舒克市| 蒲江县| 宁都县| 正定县| 城口县| 安泽县| 九寨沟县| 五莲县| 黎城县| 沙田区| 五指山市| 沭阳县| 青冈县| 德昌县| 华阴市| 扎赉特旗| 荆州市| 吉木萨尔县| 松潘县| 隆昌县| 贡嘎县| 甘孜| 平南县| 临汾市| 恩平市| 民县| 南宁市| 苍梧县|