Redis 內存管理

Redis 內存管理

1. Redis 給緩存數據設置過期時間的作用

給緩存數據設置過期時間(TTL, Time-To-Live)有以下幾個重要作用:

(1) 自動釋放內存

  • 避免緩存數據無限增長,導致 Redis 內存溢出
  • 例如,在 會話管理、短連接信息、臨時令牌 等場景下,設置過期時間可以自動清理數據,避免占用大量內存。

(2) 提高緩存的實時性

  • 設置較短的 TTL 讓數據 保持新鮮,保證用戶獲取的是最新的數據。
  • 例如,熱點新聞、秒殺活動商品庫存,需要定期更新。

(3) 限制數據的生命周期

  • 適用于 驗證碼、用戶 Token 等數據,超時后自動失效,提高安全性
  • 例如,驗證碼有效期 5 分鐘,超時后自動刪除,防止惡意重復使用。

(4) 提高緩存命中率

  • 如果數據頻繁變化,不設置過期時間,可能導致大量 冷數據 長期占用內存,影響緩存命中率。
  • 通過 TTL 控制數據生命周期,保證 Redis 主要存儲熱點數據。

2. Redis 是如何判斷數據是否過期的?

Redis 通過 兩種方式 判斷數據是否過期:

(1) 訪問 Key 時檢查(惰性刪除)

  • **機制:**當客戶端訪問一個 Key(如 GET key)時,Redis 檢查其過期時間:
    • 如果 Key 已過期,立即刪除,并返回 nil 或默認值。
    • 如果 Key 未過期,則正常返回數據。
  • 優點:減少 CPU 資源占用,僅對訪問的數據進行檢查。
  • 缺點:如果一個 Key 長期不被訪問,即使已經過期,也不會被刪除,可能導致 內存占用過高

(2) 定期掃描過期 Key(定期刪除)

  • **機制:**Redis 每 100ms 進行一次過期檢查:
    1. 隨機抽取部分 Key(默認 20 個)。
    2. 檢查是否過期,如果過期就刪除。
    3. 如果刪除的 Key 超過 25%(默認閾值),則繼續下一輪檢查,避免過期 Key 堆積。
  • 優點:可以主動清理一部分過期數據,減少內存占用。
  • 缺點無法保證所有過期 Key 及時刪除,仍可能導致部分過期數據滯留。

3. Redis 過期 Key 的刪除策略

Redis 采用 三種刪除策略 結合使用,以平衡 性能內存占用

刪除策略觸發時機優點缺點
惰性刪除訪問 Key 時檢查CPU 資源占用低,只檢查訪問的數據冷數據不會被清理,可能導致內存占滿
定期刪除每 100ms 掃描部分 Key主動清理一部分過期 Key,避免過期數據堆積無法清理所有過期 Key,仍可能占用大量內存
內存淘汰(Eviction)內存滿時觸發確保 Redis 可用,釋放空間給新數據可能刪除熱點數據,影響緩存命中率

4. Redis 的內存淘汰策略(Eviction Policy)

如果過期 Key 沒有及時刪除,導致 內存達到 maxmemory 限制,Redis 會采用 內存淘汰策略 釋放空間,主要有三類:

(1) 直接拒絕寫入

  • noeviction(默認策略):
    • 機制:當 Redis 內存滿了拒絕新的寫入請求,返回錯誤。
    • 適用場景:適用于 不能丟失數據 的場景(如金融交易數據)。
    • 缺點:可能導致系統不可用。

(2) 僅淘汰帶過期時間(TTL)的 Key

  • volatile-lru:淘汰 帶 TTL 的 Key,按 LRU(最近最少使用)刪除。
  • volatile-lfu:淘汰 帶 TTL 的 Key,按 LFU(最少使用)刪除。
  • volatile-random隨機刪除 帶 TTL 的 Key。
  • volatile-ttl:優先刪除 TTL 最短的 Key

(3) 淘汰所有 Key

  • allkeys-lru:在 所有 Key 中,刪除 最近最少使用(LRU) 的 Key。
  • allkeys-lfu:在 所有 Key 中,刪除 最少使用(LFU) 的 Key。
  • allkeys-random隨機刪除 任意 Key。

淘汰策略對比

策略適用范圍適用場景優點缺點
noeviction所有 Key不能丟失數據的業務數據絕對安全可能導致 Redis 無法寫入
allkeys-lru所有 Key普通緩存(如 Web 緩存)保留熱點數據LRU 計算有額外開銷
volatile-lru僅帶 TTL有過期時間的緩存保留熱點緩存數據TTL 過少時,可能無 Key 可刪除
allkeys-random所有 Key低優先級緩存簡單高效可能誤刪熱點數據
volatile-random僅帶 TTL無訪問規律的緩存低計算成本命中率低
volatile-ttl僅帶 TTL定期緩存數據優先刪除即將過期的數據TTL 設定不合理可能影響命中率
allkeys-lfu所有 Key熱點數據變化快優先保留高頻訪問數據計算比 LRU 高
volatile-lfu僅帶 TTL高頻訪問緩存結合訪問頻率和 TTL 進行優化計算比 LRU 高

5. 綜述

  1. 為什么 Redis 需要設置過期時間?
    • 釋放內存,防止數據無限增長。
    • 保證數據實時性,避免使用陳舊數據。
    • 提高緩存命中率,讓 Redis 保留熱點數據。
    • 符合業務需求(如驗證碼、Token 需要自動失效)。
  2. Redis 如何判斷 Key 是否過期?
    • 惰性刪除:訪問 Key 時檢查,若過期則刪除。
    • 定期刪除:每 100ms 隨機檢查部分 Key,并刪除過期 Key。
  3. Redis 過期 Key 如何刪除?
    • 惰性刪除 + 定期刪除 + 內存淘汰策略 結合,平衡 性能內存占用
  4. Redis 如何在內存滿時清理數據?
    • 默認拒絕寫入(noeviction
    • 基于 LRU/LFU/TTL 的內存淘汰策略
    • 隨機淘汰或基于訪問頻率、TTL 進行優化

通過合理設置 過期時間 + 淘汰策略,可以讓 Redis 高效管理內存,保證緩存數據的 可用性和實時性

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

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

相關文章

PyCharm中使用pip安裝PyTorch(從0開始僅需兩步)

無需 anaconda,只使用 pip 也可以在 PyCharm 集成環境中配置深度學習 PyTorch。 本文全部信息及示范來自 PyTorch 官網。 以防你是super小白: PyCharm 中的命令是在 Python Console 中運行,界面左下角豎排圖標第一個。 1. 安裝前置包 numpy …

掌握新編程語言的秘訣:利用 AI 快速上手 Python、Go、Java 和 Rust

網羅開發 (小紅書、快手、視頻號同名) 大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等…

如何理解java中Stream流?

在Java中,Stream 是 Java 8 引入的一個強大API,用于處理集合(如 List、Set、Map 等)數據的流式操作。它提供了一種聲明式、函數式的編程風格,可以高效地進行過濾、映射、排序、聚合等操作。 Stream 的核心概念 流&…

【Vitis AIE】FPGA快速部署ConvNet 示例MNIST數據集

AIE-ML 上的 MNIST ConvNet 版本:Vitis 2024.2 簡介 本教程在 AMD VersalTM 自適應 SoC AIE-ML 上實現了一個卷積神經網絡分類器,用于識別來自 MNIST 數據庫 的手寫數字。目標是說明如何將一個簡單的機器學習示例分區和向量化到 Versal AI 引擎。MNIS…

ubuntu桌面圖標異常——主目錄下的所有文件(如文檔、下載等)全部顯示在桌面

ubuntu桌面圖標異常 問題現象問題根源系統級解決方案方法一:全局修改(推薦多用戶環境)方法二:單用戶修改(推薦個人環境)操作驗證與調試避坑指南擴展知識參考文檔問題現象 主目錄文件異常顯示 用戶主目錄(如/home/user/)下的所有文件(如文檔、下載等)全部顯示在桌面,…

OceanBase 4.3.3 AP 解析:應用 RoaringBitmaps 類型處理海量數據的判重和基數統計

對于大數據開發人員而言,處理海量數據的判重操作和基數統計是常見需求,而 RoaringBitmap類型及其相關函數是當前非常高效的一種解決方案,許多大數據庫產品已支持RoaringBitmap類型。OceanBase 4.3.3版本,作為專為OLAP場景設計的正…

W25Qxx

概述 FLASH FLASH是一種是非易失性存儲器,即掉電后不會丟失數據,這和RAM(隨機存儲器)不同。 FLASH比起同作用的EEPROM有價格低的優點 FLASH的擦除操作是以扇區為單位的(比起EEPROM來說操作較為不方便) 芯片…

(滑動窗口)算法訓練篇11--力扣3.無重復字符的最長字串(難度中等)

目錄 1.題目鏈接:3.無重復字符的最長字符 2.題目描述: 3.解法(滑動窗口): 1.題目鏈接:3.無重復字符的最長字符 2.題目描述: 給定一個字符串 s ,請你找出其中不含有重復字符的 最長 子串 的長度。 示例…

深度學習1—Python基礎

深度學習1—python基礎 你的第一個程序 print(hello world and hello deep learning!)基本數據結構 空值 (None):在 Python 中,None 是一個特殊的對象,用于表示空值或缺失的值。它不同于數字 0,因為 0 是一個有意義的數字&#…

記一次MyBatis分頁莫名其妙的失效,首次執行合適,后續執行分頁失效且異常

代碼幾乎一樣,為啥這個xml配置的就會出現莫名其妙的問題呢 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertymybatis_plus_first, modeI…

網絡不可達

導致此問題原因較多,我只針對一種情況進行討論,如果和文中癥狀不同,另尋他處,或者死馬當活馬醫(?) 如需轉載,標記出處 癥狀: 1.ping命令網絡不可達 2.ifconfig中網卡en…

【AI News | 20250322】每日AI進展

AI Repos 1、DeTikZify 可以把草圖或圖形轉換成TikZ代碼的模型,可用來繪制復雜的科學圖表,輸入草圖或文字描述即可轉換成TikZ代碼。DeTikZify強大的地方在于它能理解圖表的語義信息, 能識別圖表中的不同組成部分及其含義,比如坐標…

Debian12生產環境配置筆記

在 Debian 12 上進行生產環境配置的詳細步驟,涵蓋軟件更新、基礎軟件安裝、Docker 及 Redis 部署,以及 Nginx 配置多個虛擬主機等內容。所有命令均以 root 用戶身份執行,無需添加 sudo 1. 更新軟件 首先,確保系統上的所有軟件包…

UE AI 模型自動生成導入場景中

打開小馬的weix 關注下 搜索“技術鏈” 回復《《動畫》》 快速推送; 拿到就能用輕松解決!幫忙點個關注吧!

【最后203篇系列】022 用Deepseek14b提取新聞事件

這算是之前一直想做的一件事,趁周末趕快做了。 業務意義:現實中有大量的輿情,這對我們的決策會有比較重要的作用 技術依賴: 1 模型基礎能力2 消息隊列3 異步獲取消息4 時間序列庫 1 模型基礎能力 大模型發展到現在&#xff0…

電池電量檢測方法介紹,開路電壓法、庫侖積分法、內阻法

開路電壓法、庫侖積分法、內阻法、卡爾曼濾波法、混合法 開路電壓法是目前最簡單的方法,根據電池的特性得知,在電池容量與開路電壓之間存在一定的函數關系,當得知開路電壓時,可以初步估算電池的剩余電量。該方法精度不高&#xf…

微調實戰 - 使用 Unsloth 微調 QwQ 32B 4bit (單卡4090)

本文參考視頻教程:賦范課堂 – 只需20G顯存,QwQ-32B高效微調實戰!4大微調工具精講!知識灌注問答風格微調,DeepSeek R1類推理模型微調Cot數據集創建實戰打造定制大模型! https://www.bilibili.com/video/BV1…

【Elasticsearch】基于 Word2Vec 實現文章抄襲檢測

?? 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c=1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編程,高并發設計,Springboot和微服務,熟悉Linux,ESXI虛擬化以及云原生Docker和K8s…

多層感知機與反向傳播

1. 多層感知機(MLP) 多層感知機是一個由多個層組成的神經網絡,包括輸入層、隱藏層和輸出層。它的目標是通過學習輸入數據和輸出結果之間的關系,來解決各種問題(比如分類或回歸)。 2. 反向傳播&#xff08…

Cursor的五種高級用法

文章目錄 代碼編寫寫作編輯自動生成工作流搞定開源項目數據處理參考 代碼編寫 Cursor 最基本的功能是幫助你編寫代碼。只需使用 Composer(CtrlI),描述你想要實現的功能,Cursor 就能生成相應的代碼。不滿意?直接告訴它…