Redis內存使用耗盡情況分析

目錄

1、內存上限介紹

1.1、產生原因

1.2、Redis的maxmemory限額

1.3、影響的命令與場景

2.?內存用完后的策略

2.1、淘汰策略分類

2.2、淘汰策略介紹

2.3、不同策略對比

3、常見業務示例

3.1、影響

3.2、監控與自動告警


前言

????????在日常項目中,不知道你思考過沒有redis的內存耗盡的情況?

如下所示:

具體行為:

當內存滿時:

  • 讀操作(如GET):可以正常進行
  • 寫操作(如SET、LPUSH、SADD等):
    • 如果能通過淘汰策略釋放一點空間,則寫入繼續
    • 如果根據策略無法再釋放空間(比如noeviction),則直接返回錯誤:“OOM command not allowed when used memory > 'maxmemory'.”

風險:

  • 如果是noeviction(默認),Redis直接拒絕寫入!
  • 如果淘汰策略被觸發,你的“舊數據”就會被自動刪除(可能有業務風險)。
  • 內存頁碎片、fork快照等也會加速內存耗盡。
  • 極端情況下,如果宿主機內存被撐爆,系統可能直接kill掉Redis進程(OOM Killer)。

關于更多redis的介紹,可參考:對Redis組件的深入探討_redis 磁盤 內存-CSDN博客文章瀏覽閱讀1.3k次,點贊20次,收藏8次。前言在介紹redis的時候,先介紹下存儲介質,磁盤和內存。通過對以下兩種認識,對了解redis有著更深的理解。如下圖所示:以上就是r。_redis 磁盤 內存 https://blog.csdn.net/weixin_50055999/article/details/147757520?spm=1011.2415.3001.5331


1、內存上限介紹

????????Redis是內存數據庫所有數據(Key/Value)都存放在內存(RAM)中,不像MySQL等主要用磁盤。

Redis的數據結構不僅要存儲你的 key/value 數據,還要存儲:

1、Key/value 相關的元數據(如過期信息)

2、Append Only File (AOF)

3、緩沖區復制緩沖區、客戶端連接緩沖區等

所以實際內存消耗 = 數據+各種維護數據+內存碎片。

1.1、產生原因

1、數據總量超過maxmemory配置:

這是最常見情況:寫入、緩存、業務量上漲、沒有刪除機制,累計到了上限。

2、未設置maxmemory,Redis自動用光了系統全部內存:

系統會自動kill Redis進程(Linux OOM Killer)。

3、AOF或RDB備份引起內存瞬時暴漲:

快照/流復制/fork過程占用大量額外內存

4、客戶端緩沖區、復制緩沖區太大:

有些命令或者慢客戶端導致緩沖區堆積

5、內存碎片率很高:

內存并不是100%利用,碎片率過高也會導致出現“看似還有容量,實際已用盡”的問題。

1.2、Redis的maxmemory限額

Redis 是基于內存的數據庫,其總內存上限可通過maxmemory參數配置。

比如在redis.conf中:

maxmemory 1gb

如果你沒有設置,理論上 Redis 可以用光宿主機所有可用內存,直到被Linux OOM殺死進程。

1.3、影響的命令與場景

1、影響所有產生新內存分配的命令

包括:set/hash/set/zset/list的增量寫入命令,bitmap、hyperloglog…

2、以下命令不會報錯

讀命令(GET/EXISTS/SCAN等)

刪除命令(DEL/EXPIRE/UNLINK)

清空命令(FLUSHDB、FLUSHALL)


2.?內存用完后的策略

????????當 Redis 達到?maxmemory?限制(即內存“用完”),會按照配置的淘汰策略(maxmemory-policy參數)來處理新寫入命令

如下圖所示:

寫請求 -> 檢查used_memory|是否超maxmemory?/        \否         是|           |正常寫   執行淘汰策略|能釋放內存嗎?/     \能       不能|           |正常寫     返回OOM錯誤,寫失敗

2.1、淘汰策略分類

  • noeviction默認):不淘汰,拒絕寫入,只允許讀;
  • allkeys-lru:將所有key中最久未使用的key淘汰;
  • volatile-lru:只對設置了過期時間的key做lru淘汰;
  • allkeys-random:所有key隨機淘汰;
  • volatile-random只對設置了過期的key隨機淘汰;
  • volatile-ttl優先淘汰過期時間到期最早的key;
  • volatile-lfu、allkeys-lfu:最不常用的(Least Frequently Used)key被淘汰。

2.2、淘汰策略介紹

1、noeviction(默認)

只讀不寫:?所有新增key、修改key、增加元素的命令(如SET、LPUSH、HSET等) 統統返回錯誤(error),只允許讀(GET等)。

(error) OOM command not allowed when used memory > 'maxmemory'.
  • 危險:
    • 業務寫入完全中斷
    • 可能造成數據庫/隊列/秒殺等核心數據業務丟失
    • 生產極其危險,尤其是做緩存穿透時容易擊穿下游數據庫

2、allkeys-lru

自動淘汰:?

????????優先淘汰“最久未使用”的key(Least Recently Used),騰出空間讓新數據寫成功。

風險:

????????部分“冷數據”被自動刪掉,新數據繼續寫入,服務不中斷,但有可能丟掉了有用的老數據。

3、volatile-lru

  • 只判斷有過期時間(expire)的key
  • 只淘汰帶過期時間的key,不帶過期屬性的key永遠不會被刪
  • 如果全是永久key,效果跟noeviction一樣,容易寫不進去

4、allkeys-random/volatile-random

  • allkeys-random:任意key隨機淘汰
  • volatile-random:也只淘汰帶過期的key,隨機選擇。

5、volatile-ttl

淘汰帶過期時間里“快要到期”的key。

6、allkeys-lfu/volatile-lfu

淘汰最少被訪問的key(Least Frequently Used),更智能。

2.3、不同策略對比

如下所示:

注意

  • 持久化(RDB/AOF)也有可能被影響,如果沒法持久化新數據,有可能異常或數據丟失!
  • 主從同步、集群等同步數據也受maxmemory影響。

3、常見業務示例

3.1、影響

1、緩存:

????????如果用作普通緩存,可以用allkeys-lru/allkeys-lfu讓Redis自動“以空間換時間”。熱點數據永遠在,冷數據慢慢淘汰,更健康

2、持久化隊列/核心計數/實時業務:

? ? ? ? 如果Redis用作數據庫功能(存放業務數據、消費隊列),noeviction策略推薦。避免關鍵數據被誤刪。一旦寫入超限應報警、擴容、限流,絕不隨便丟“老數據”

3、大key、熱key、慢客戶端

某個大key占住大量內存,會加速爆表,需依據業務定期分析優化。

更多bigkey文章介紹,參考:

Redis中的bigkey的介紹及影響_redis 大key-CSDN博客文章瀏覽閱讀1.2k次,點贊31次,收藏12次。什么是BigKey?為什么它成為Redis的性能殺手?BigKey指在Redis中key對應的value占用內存或元素數量超出業務合理閾值的鍵值對。_redis 大key https://blog.csdn.net/weixin_50055999/article/details/148856033?spm=1011.2415.3001.5331

4、內存暴漲瞬間寫崩潰

? ? ? ?新增了超大key(如bitmap、大string、大list),遠超單條key的預期,會導致寫入命令的突然異常或長時間阻塞(尤其fork的時候)。

3.2、監控與自動告警

建議配合運維/監控工具(如Prometheus、Grafana、redis_exporter、阿里云/騰訊云云監控等)。

重點關注:

1、used_memory (info memory)。

2、maxmemory。

3、內存碎片率。

4、淘汰計數器evicted_keys。

5、命令拒絕計數rejected_connections


總結

????????Redis的內存滿了,不同的淘汰策略決定要不要丟棄已有數據騰空間,否則直接拒絕寫入并報錯,只能讀不能寫,業務必須配合好監控、限流和數據結構優化。


參考文章:

1、內存耗盡后,Redis會發生什么?_redis中key沒有達到過期時間,但是內存滿了會怎么樣?-CSDN博客文章瀏覽閱讀84次。作為一臺服務器來說,內存并不是無限的,所以總會存在內存耗盡的情況,那么當 Redis 服務器的內存耗盡后,如果繼續執行請求命令,Redis 會如何處理呢?_redis中key沒有達到過期時間,但是內存滿了會怎么樣? https://blog.csdn.net/qq_30987095/article/details/143257130?ops_request_misc=%257B%2522request%255Fid%2522%253A%252295fab89f19b3cb10a23ea7030593bb32%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=95fab89f19b3cb10a23ea7030593bb32&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-143257130-null-null.142^v102^control&utm_term=redis%E5%86%85%E5%AD%98%E8%80%97%E5%B0%BD&spm=1018.2226.3001.4187

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916828.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu 系統中配置 SSH 服務教程

一、什么是 SSH?SSH(Secure Shell)是一種加密的網絡協議,用于在不安全的網絡中安全地進行遠程登錄、遠程命令執行和文件傳輸。它是 Telnet、FTP 等傳統協議的安全替代品。二、確認系統環境在開始配置之前,請確認你的系…

基于springboot的編程訓練系統設計與實現(源碼+論文)

一、開發環境 技術/工具描述MYSQL數據庫一個真正的多用戶、多線程SQL數據庫服務器,適用于Web站點或其他應用軟件的數據庫后端開發。B/S結構基于互聯網系統的軟件系統開發架構,利用瀏覽器進行訪問,支持多平臺使用。Spring Boot框架簡化新Spri…

K8s集群兩者不同的對外暴露服務的方式

在工作中,我們暴露集群內的服務通常有幾種方式,對于普通的http或者https,我們通常使用?Ingress Nginx? ,對于原始的TCP或者UDP端口服務,可能需要選擇 ?LoadBalancer? ,它們的核心區別在于工作層級、協議支持和流量…

實習日志111

第一天 加入內網和內網域,設置自己的操作系統 第二天 安裝常用軟件和平臺 Notepad 是一款免費的源代碼編輯器,支持多種編程語言,其功能強大且界面友好,適用于 Windows 操作系統。WinMerge 是一款開源的差異比較和合并工具&…

Redis 服務掛掉排查與解決

Redis 是一個高性能的鍵值對存儲系統,廣泛應用于緩存、會話存儲、消息隊列等場景。在使用 Redis 的過程中,偶爾會遇到 Redis 服務掛掉或無法連接的情況。本文將通過常見錯誤 RedisException in Redis.php line 63 Connection refused 來講解如何排查并解…

DOM + HTML + HTTP

一、HTML5的新特性 1.語義化標簽:其實就是可以讓標簽有自己的含義 html4之前都是有的,比如:<h1>、<ul>、<li> html5新增了很多語義化標簽:<header>、<nav> html5的語義化標簽的常用頁面布局: 優點: 1.代碼結構清晰,方便閱讀,有利于團…

HTML 音頻/視頻

HTML 音頻/視頻 引言 HTML 音頻和視頻標簽是網頁設計中不可或缺的部分,它們為用戶提供了一種將多媒體內容嵌入到網頁中的方式。本文將詳細介紹 HTML 音頻/視頻標簽的用法、屬性和注意事項,幫助開發者更好地在網頁中嵌入音頻和視頻。 HTML 音頻標簽( ) 1. 標簽基本用法 …

Apache Ignite Cluster Groups的介紹

以下這段內容是 Apache Ignite 官方文檔中關于 Cluster Groups&#xff08;集群組&#xff09; 的介紹。我來用通俗易懂的方式幫你全面理解這個概念。&#x1f310; 什么是 Cluster Group&#xff1f; 簡單來說&#xff1a;Cluster Group 就是一個“節點的子集”。想象一下你的…

github上傳本地項目過程記錄

最近有和別人進行unity項目協作的需求&#xff0c;需要把自己的本地代碼上傳到github已有的一個倉庫里。記錄一下上傳過程&#xff0c;防止后續還需要用。 文章目錄一、把自己的本地代碼上傳到github已有的一個倉庫中二、常用功能一、把自己的本地代碼上傳到github已有的一個倉…

Spring AI Alibaba

目錄 前言&#xff1a; 一、Spring AI 和Spring AI Alibaba 二、Spring AI Alibaba快速入門 1.環境 2.ollama 3.阿里百煉 前言&#xff1a; 2025年真的是AI大爆發的一年&#xff0c;以后無論是什么行業我想都需要AI了&#xff0c;作為一名計算機人&#xff0c;你不學習AI…

【GaussDB】內存資源告急:深度診斷一起“memory temporarily unavailable“故障

【GaussDB】診斷一起內存臨時不可用的問題 &#x1f4cb; 背景 在客戶測試環境中&#xff08;GaussDB 506.0 SPC0100 集中式&#xff09;&#xff0c;一個重度使用存儲過程的系統&#xff0c;頻繁出現內存臨時不可用的問題(ERROR: memory is temporarily unavailable)。令人困…

FastDFS如何提供HTTP訪問電子影像文件

Nginx 作為高性能的 Web 服務器和反向代理服務器&#xff0c;與 FastDFS 結合使用&#xff0c;本文主要介紹用于處理 FastDFS 存儲文件的 HTTP 訪問請求&#xff0c;方便客戶端通過 HTTP 協議直接訪問存儲在 FastDFS 中的文件&#xff0c;在電子影像系統中&#xff0c;Nginx 可…

水面垃圾識別分割數據集labelme格式2111張8類別

數據集中有部分增強圖片&#xff0c;注意為了提供模型泛化識別能力&#xff0c;有很少一部分不是水面垃圾。具體看圖片數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件)圖片數量(jpg文件個數)&#xff1a;2111標注數量(json文件…

北京-4年功能測試2年空窗-報培訓班學測開-第六十二天-模擬未通過,繼續準備自我介紹項目介紹面試題中

今日產出&#xff0c;完成昨天模擬面試錄音的重聽和整理&#xff0c;完成自我介紹梳理&#xff0c;還重寫了三個算法題&#xff0c;寫了4個sql題。和同學打語音提問今天專注力不強&#xff0c;因為焦慮項目和面試題。關于項目&#xff0c;我理解的&#xff0c;老師以前錄屏講的…

自動化輔助工具教程

該工具支持全部平臺使用

里程碑 | 1Panel開源面板GitHub Star數量突破30,000個!

截至2025年7月23日20:00&#xff0c;飛致云旗下開源項目——1Panel開源Linux服務器運維管理面板GitHub Star數超過30,000個&#xff01; 繼Halo之后&#xff0c;1Panel成為飛致云旗下第二個GitHub Star數量超過30,000個的開源項目&#xff0c;也是飛致云旗下最快達成30,000個Gi…

雨雪霧冰全預警:交通氣象站為出行安全筑起“隱形防護網”

冬季濃霧彌漫高速&#xff0c;能見度降至 50 米以下&#xff1b;夏季暴雨傾盆&#xff0c;低洼路段眨眼間積水成河…… 惡劣天氣總是公路交通安全的大敵。關鍵時刻&#xff0c;交通氣象站挺身而出&#xff0c;成為保障道路暢通與行車安全的科技尖兵。交通氣象站專為復雜道路環境…

C++(面向對象之繼承、多態)

一、繼承前言在c里面&#xff0c;繼承是指2個類之間的關系例如&#xff1a;有一個org類&#xff0c;功能很完善&#xff0c;體量很大&#xff0c;突然有一天&#xff0c;需求發生改變&#xff0c;org類不能滿足新的需求&#xff0c;我們的第一想法是&#xff0c;復制 org 類代碼…

【數據可視化-75】北京密云區2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可視化(含完整數據、代碼)

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Voxtral Mini:語音轉文本工具,支持超長音頻,多國語音

Voxtral是什么 Mistral AI 推出的 Voxtral 是一款強大的音頻模型&#xff0c;專為語音交互打造&#xff0c;具備卓越的語音轉寫和語義理解能力。它提供 24B 和 3B 兩種版本&#xff0c;分別適用于大規模生產和本地部署。Voxtral 支持多語言、長文本上下文、問答與總結&#xf…