国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決

這篇具有很好參考價(jià)值的文章主要介紹了Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

問(wèn)題現(xiàn)象

表面現(xiàn)象是系統(tǒng)登錄突然失效,排查原因發(fā)現(xiàn),使用redis查詢(xún)用戶(hù)信息異常,從而定位到redis問(wèn)題

if (PassWord.equals(dbPassWord)) {
        map.put("rtn", 1);
        map.put("value", validUser);
        session.setAttribute("username", user.getUsername());                                       
        redisWarehouseControlUtil.addObjectData(user.getUsername(),user.getUsername(),30);
}

排查原因

我的redis使用的是華為云的redis分布式緩存服務(wù),所以在問(wèn)題排查方面,我們可以結(jié)合華為云提供的豐富的分析診斷工具來(lái)輔助排查解決問(wèn)題。

1、問(wèn)題定位到redis上,登陸redis服務(wù)器,發(fā)現(xiàn)服務(wù)器內(nèi)存使用率100%。

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

2、使用華為云的性能監(jiān)控功能,查詢(xún)指定時(shí)段的內(nèi)存使用率信息。發(fā)現(xiàn)“內(nèi)存利用率”指標(biāo)持續(xù)接近100%。查詢(xún)內(nèi)存使用率超過(guò)95%的時(shí)間段內(nèi),“已逐出的鍵數(shù)量”和“命令最大時(shí)延”,均呈現(xiàn)顯著上升趨勢(shì),表明存在內(nèi)存不足的問(wèn)題。

當(dāng)內(nèi)存不足時(shí),可能導(dǎo)致Key頻繁被逐出、響應(yīng)時(shí)間上升、QPS(每秒訪問(wèn)次數(shù))不穩(wěn)定等問(wèn)題,基本上redis服務(wù)已經(jīng)癱瘓。

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

3、先使用實(shí)例診斷功能,大體分析一下可能得問(wèn)題原因:主要還是內(nèi)存占用過(guò)高問(wèn)題。

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

4、使用華為云的緩存分析功能,執(zhí)行大Key掃描,發(fā)現(xiàn)另一個(gè)項(xiàng)目的ErrorMeterData?key,他是一個(gè)list隊(duì)列,竟然存儲(chǔ)數(shù)據(jù)占了2.6G,還有兩個(gè)key存儲(chǔ)數(shù)據(jù)占用了幾百M(fèi),就是這三個(gè)key把服務(wù)器的內(nèi)存占滿(mǎn)了。

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

5、分析查找原因:去代碼中查找ErrorMeterData?key對(duì)應(yīng)的功能,找到了問(wèn)題所在,這個(gè)key存儲(chǔ)的是解析出現(xiàn)異常的數(shù)據(jù)隊(duì)列,但問(wèn)題是,開(kāi)發(fā)這個(gè)功能的同事,并沒(méi)有給這個(gè)key設(shè)置過(guò)期時(shí)間,也沒(méi)有對(duì)這個(gè)異常數(shù)據(jù)隊(duì)列的數(shù)據(jù)進(jìn)行其他處理,就一直存在這個(gè)隊(duì)列中,隨著時(shí)間的增長(zhǎng),以及異常數(shù)據(jù)的日復(fù)一日的不斷累加,會(huì)導(dǎo)致存儲(chǔ)數(shù)據(jù)太多,終于內(nèi)存被占滿(mǎn)。這是一個(gè)非常嚴(yán)重的bug。

問(wèn)題就出在:redisMeterDataUtil.AddErrorMeterDataList(baseMessage);這一步

private void MeterDataExtractProcess()  {
    boolean rtn = false;
    while (!needClose) {
      // 普通表數(shù)據(jù)的解析
      try {
        BaseMessage baseMessage = redisMeterDataUtil.getMeterData();
        if (baseMessage != null) {
          if (!baseMessage.getFunctionCode().equals("") && baseMessage.getFunctionCode() != null) {
            switch (baseMessage.getFunctionCode()) {

                // 溫控面板解析 --主動(dòng)上傳 批量
              case FunctionCode.UploadTcStateData:
                UploadTcStateDataMessage tcStateDataMessage =
                    new UploadTcStateDataMessage(baseMessage);
                rtn = tcStateDataService.addUploadTcStateDataDataMessage(tcStateDataMessage);
                break;
                //  //根據(jù)表號(hào)讀取,單條    溫控面板解析
              case FunctionCode.getTcStateData:
                ReplyTcStateDataMessage replyTcStateDataMessage =
                    new ReplyTcStateDataMessage(baseMessage);
                rtn = tcStateDataService.addTcStateDataMessage(replyTcStateDataMessage);
                break;

              default:
                break;
            }

            if (rtn == false) {
              // 解析方法存儲(chǔ)失敗,將數(shù)據(jù)添加到錯(cuò)誤隊(duì)列
              redisMeterDataUtil.AddErrorMeterDataList(baseMessage);
            }
          } else {
            // 若隊(duì)列數(shù)據(jù)為空,則線(xiàn)程休眠1s后繼續(xù)執(zhí)行
            ThreadSleep(1000);
            continue;
          }
        }
      } catch (Exception e) {
          logger.error("MeterDataExtractServer--表數(shù)據(jù)redis解析出錯(cuò)"+e.getMessage());
          ThreadSleep(1000);
      }
public void AddErrorMeterDataList(BaseMessage baseMessage) {
        addData(ErrorMeterDataListSign, baseMessage);
    }


private void addData(String type, Object data) {
        String key = type;
        redisTemplate.opsForList().leftPush(key, data);

    }

6、如果你沒(méi)有使用華為云或者阿里云的專(zhuān)門(mén)的redis服務(wù),而是自己在服務(wù)器搭建的Redis服務(wù)。那么排查問(wèn)題的步驟和方法,大體可以分為幾步:

  1. 查詢(xún)?cè)\斷服務(wù)的CPU、內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)等是否正常
  2. 查看日志分析異常問(wèn)題
  3. 如果是內(nèi)存占滿(mǎn)問(wèn)題,則可以在Redis-cli客戶(hù)端連接實(shí)例后,執(zhí)行大key掃描命令或者執(zhí)行過(guò)期key掃描(過(guò)期key掃描會(huì)對(duì)鍵空間進(jìn)行Redis的scan掃描,釋放內(nèi)存中已過(guò)期但是由于惰性刪除機(jī)制而沒(méi)有釋放的內(nèi)存空間),并查看key的內(nèi)存占用情況。并對(duì)內(nèi)存占用過(guò)大的key進(jìn)行處理。

如果你想掃描Redis實(shí)例中的大key,你可以使用SCAN命令結(jié)合TYPE命令來(lái)獲取每個(gè)鍵的類(lèi)型,并根據(jù)鍵的類(lèi)型獲取其大小。

以下是一個(gè)示例的命令:

bash復(fù)制代碼

redis-cli SCAN 0 MATCH * COUNT 1000 | while read key; do type=$(redis-cli TYPE $key); size=$(redis-cli -c GET $key | wc -c); echo "$key: $type, Size: $size"; done

這個(gè)命令將使用SCAN命令迭代整個(gè)數(shù)據(jù)庫(kù),并對(duì)每個(gè)鍵執(zhí)行TYPE命令來(lái)獲取鍵的類(lèi)型。然后,對(duì)于字符串類(lèi)型的鍵,使用GET命令獲取其值,并使用wc -c命令計(jì)算其長(zhǎng)度。最后,將鍵、類(lèi)型和大小輸出到終端。

另外,如果你想查看Redis實(shí)例的output buffer占用情況,你可以使用CONFIG GET output-buffer-limit命令來(lái)獲取output buffer的配置信息。該命令將返回output buffer的配置參數(shù),包括類(lèi)型、大小和閾值。

請(qǐng)注意,上述命令中的redis-cli -c GET $key是用于獲取字符串類(lèi)型的鍵的大小。對(duì)于其他類(lèi)型的鍵,你可能需要使用其他命令或方法來(lái)獲取其大小。

處理措施

1、為內(nèi)存占用過(guò)大的key設(shè)置過(guò)期時(shí)間,這樣數(shù)據(jù)就不會(huì)一直存儲(chǔ)在隊(duì)列中

(1)比較緊急想要恢復(fù)redis,且隊(duì)列中的數(shù)據(jù)不重要,則可以直接鏈接redis,執(zhí)行命令

EXPIRE key seconds:設(shè)置鍵的過(guò)期時(shí)間(以秒為單位),過(guò)期后鍵將被自動(dòng)刪除。

或者

DEL key:刪除指定鍵

(2)在代碼中為key設(shè)置過(guò)期時(shí)間

/**
     * 設(shè)置設(shè)備緩存過(guò)期時(shí)間(分鐘)
     * @param type 設(shè)備分類(lèi)
     */
    private void setExpireTime(String type,int cacheTime) {
        String key = type;
        redisTemplate.expire(key,cacheTime,TimeUnit.MINUTES);
    }

/**
     * 設(shè)置表數(shù)據(jù)緩存失效時(shí)間list集合
     */
    public void setMeterInfoExpire() {
        setExpireTime(MeterDataListSign,deviceCacheTime);
    }

2、業(yè)務(wù)邏輯上將這個(gè)異常數(shù)據(jù)隊(duì)列的數(shù)據(jù),重新返回處理隊(duì)列,設(shè)置返回次數(shù),如果超過(guò)三次以上,還是沒(méi)有被正常隊(duì)列處理掉,則將異常數(shù)據(jù)持久化,并刪除redis中的該異常數(shù)據(jù)。

我的實(shí)際業(yè)務(wù)中,異常數(shù)據(jù)沒(méi)有重回隊(duì)列處理的必要了,所以我的業(yè)務(wù)代碼中,直接不在用redis隊(duì)列存儲(chǔ)異常數(shù)據(jù),而是直接將異常數(shù)據(jù)持久化存儲(chǔ)到mongodb中。

if (rtn == false) {
     // 解析方法存儲(chǔ)失敗,將數(shù)據(jù)添加到錯(cuò)誤隊(duì)列----不再存在redis,直接持久化存儲(chǔ)到mongodb
     //redisMeterDataUtil.AddErrorMeterDataList(baseMessage);
     tcErrorMessageHistoryUtil.addMessage(baseMessage);
}

3、設(shè)置key的過(guò)期時(shí)間后,過(guò)了一段時(shí)間內(nèi)存恢復(fù)正常

Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),javaRedis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決,Redis,redis,數(shù)據(jù)庫(kù),java

總結(jié)

在使用redis的對(duì)象或者list隊(duì)列等實(shí)例時(shí),要記得給key設(shè)置過(guò)期時(shí)間,避免數(shù)據(jù)一直堆積無(wú)法釋放。對(duì)于重要的異常數(shù)據(jù)隊(duì)列的數(shù)據(jù),要進(jìn)行業(yè)務(wù)處理:重回隊(duì)列或數(shù)據(jù)持久化。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-771558.html

到了這里,關(guān)于Redis內(nèi)存使用率高,內(nèi)存不足問(wèn)題排查和解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • qt使用QCustomplot繪制cpu和內(nèi)存使用率圖

    qt使用QCustomplot繪制cpu和內(nèi)存使用率圖

    ????????????QCustomPlot是一個(gè)開(kāi)源的Qt C++圖表庫(kù),用于可視化數(shù)據(jù)。該庫(kù)提供了多種類(lèi)型的可定制的圖表,包括散點(diǎn)圖、線(xiàn)圖、柱狀圖和等高線(xiàn)圖等。它還支持自定義繪制,可以創(chuàng)建任意形狀和大小的元素,并使其與其他元素交互。QCustomPlot易于集成到現(xiàn)有的Qt應(yīng)用程序中

    2024年02月09日
    瀏覽(25)
  • Linux-提高CPU、內(nèi)存使用率shell腳本

    目錄 1、提升CPU利用率 (1)構(gòu)造CPU達(dá)到100% (2) 結(jié)束命令 2、提高內(nèi)存利用率 可以申請(qǐng)的內(nèi)存 申請(qǐng)內(nèi)存空間: 完成后釋放內(nèi)存: 3、 使用ChaosBlade工具 cpu注入: 內(nèi)存注入: (1)構(gòu)造CPU達(dá)到100% for i in `seq 1 $(cat /proc/cpuinfo |grep \\\"physical id\\\" |wc -l)`; do dd if=/dev/zero of=/dev/null done (

    2024年02月04日
    瀏覽(25)
  • Linux提高CPU及內(nèi)存使用率的腳本

    測(cè)試或運(yùn)維中,有時(shí)會(huì)特意提高CPU及內(nèi)存使用率,觀察運(yùn)行情況,以下腳本供參考。 鏈接1: Linux tmpfs及消耗內(nèi)存腳本 鏈接2: Linux 中的 /dev/null 和 /dev/zero 鏈接3: Linux 提高CPU占用率的腳本

    2024年02月13日
    瀏覽(30)
  • Golang 簡(jiǎn)單的數(shù)據(jù)對(duì)齊可提高程序速度和內(nèi)存使用率

    Golang 中的結(jié)構(gòu)或 struct 是用戶(hù)定義的類(lèi)型,允許將可能不同類(lèi)型的項(xiàng)分組/組合為單一類(lèi)型。 可以說(shuō)是一個(gè)不支持繼承但支持組合的輕量級(jí)類(lèi)。 我們使用 Golang 編寫(xiě)代碼的時(shí)候,你肯定使用過(guò) struct 。 但是,你可能不知道的是,通過(guò)簡(jiǎn)單地重新排序結(jié)構(gòu)中的字段,可以極大地

    2024年02月11日
    瀏覽(16)
  • java獲取系統(tǒng)CPU和內(nèi)存使用率的三種方法

    獲取系統(tǒng)CPU和內(nèi)存的三種方法: 1、使用OperatingSystemMXBean獲取 2、使用sigar方法獲取 3、使用oshi方法獲取 以下是我在我的機(jī)子上對(duì)三種方法測(cè)試的比較 方法?? ?準(zhǔn)確率 OperatingSystemMXBean?? ?獲取的內(nèi)存數(shù)據(jù)準(zhǔn)確,CPU差距有點(diǎn)大 sigar?? ?獲取的內(nèi)存數(shù)據(jù)稍微有點(diǎn)差距,CPU相對(duì)

    2024年04月13日
    瀏覽(24)
  • python系統(tǒng)監(jiān)控程序 時(shí)間 CPU內(nèi)存使用率 硬盤(pán)大小 天氣 日歷
  • STM32 CubeMX (第四步Freertos內(nèi)存管理和CPU使用率)

    STM32 CubeMX (第四步Freertos內(nèi)存管理和CPU使用率)

    學(xué)習(xí)使用Freertos第四步 在 FreeRTOS 中,中斷管理和軟件定時(shí): · taskENTER_CRITICAL() ·; 是一個(gè)函數(shù)在 FreeRTOS 中使用的,用于進(jìn)入臨界區(qū)(critical section)。在臨界區(qū)內(nèi),中斷會(huì)被禁用,這樣可以確保在多任務(wù)環(huán)境下共享資源的安全性。你可以在需要保護(hù)共享資源的代碼段中使用 ·

    2024年02月12日
    瀏覽(24)
  • 基于WebRTC構(gòu)建的程序因虛擬內(nèi)存不足導(dǎo)致閃退問(wèn)題的排查以及解決辦法的探究

    目錄 1、WebRTC簡(jiǎn)介 2、問(wèn)題現(xiàn)象描述 3、將Windbg附加到目標(biāo)進(jìn)程上分析

    2024年02月08日
    瀏覽(40)
  • linux獲取內(nèi)存與cpu使用率(附有C語(yǔ)言源碼與shell腳本)

    linux獲取內(nèi)存與cpu使用率(附有C語(yǔ)言源碼與shell腳本)

    linux內(nèi)核提供了一種通過(guò)/proc文件系統(tǒng)來(lái)在運(yùn)行時(shí)訪問(wèn)內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu),改變內(nèi)核設(shè)置的機(jī)制,各種硬件平臺(tái)上的linux系統(tǒng)的/proc文件系統(tǒng)的基本概念都是相同的。 /proc文件系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來(lái)向進(jìn)程發(fā)送信息的機(jī)制。這個(gè)偽文件系統(tǒng)可以和內(nèi)核內(nèi)部的數(shù)據(jù)結(jié)構(gòu)進(jìn)

    2024年02月06日
    瀏覽(25)
  • k8s 檢測(cè)node節(jié)點(diǎn)內(nèi)存使用率平衡調(diào)度腳本 —— 筑夢(mèng)之路

    直接上腳本: 參考資料: 一招完美解決k8s調(diào)度不均問(wèn)題

    2024年01月16日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包