redis的key過期刪除策略和內存淘汰機制

一、key的過期刪除策略

????????原由:一般情況下,在使用redis作緩存,對k設置過期時間,當過期時間到后,k還是占用內存的,并沒有從內存中移除。

1.定時刪除

????????在設置key的過期時間的同時,為該key創建一個定時器,讓定時器在key的過期時間來臨時,對key進行刪除

????????優點:保證內存被盡快釋放

????????缺點:1>若過期key很多,刪除這些key會占用很多的CPU時間,在CPU時間緊張的情況下,CPU不能把所有的時間用來做要緊的事兒,還需要去花時間刪除這些key。

??????????????????2>定時器的創建耗時,若為每一個設置過期時間的key創建一個定時器(將會有大量的定時器產生),性能影響嚴重

2.惰性刪除

????????key過期的時候不刪除,每次從數據庫獲取key的時候去檢查是否過期,若過期,則刪除,返回null。

????????優點:刪除操作只發生在從數據庫取出key的時候發生,而且只刪除當前key,所以對CPU時間的占用是比較少的,而且此時的刪除是已經到了非做不可的地步.

????????缺點:若大量的key在超出超時時間后,很久一段時間內,都沒有被獲取過,那么可能發生內存泄露(無用的垃圾占用了大量的內存)

3.定期刪除

????????每隔一段時間執行一次刪除過期key操作

????????定期任務(serverCron)任務每隔一段時間就會運行一次,其中就包含清理過期key的任務,運行頻率由配置文件中的hz參數來控制,取值范圍1~500,默認是10,代表每秒運行10次。清理過程如下:

  1. 遍歷所有的db
  2. 從db中設置了過期時間的key的集合中隨機檢查20個key
  3. 刪除檢查中發現的所有過期key

????????如果檢查結果中25%以上的key已過期,則繼續重復執行步驟2-3,否則繼續遍歷下一個db,調大hz將會提高redis定期任務的執行頻率,如果你的redis中包含很多過期key的話,可以考慮將這個值調大,但要注意同時也會增加CPU的壓力,redis作者建議這個值不要超過100。

????????優點: 1>通過限制刪除操作的時長和頻率,來減少刪除操作對CPU時間的占用--處理"定時刪除"的缺點.

?????????????????2>定期刪除過期key--處理"惰性刪除"的缺點

????????缺點:1>在內存友好方面,不如"定時刪除"

??????????????????2>在CPU時間友好方面,不如"惰性刪除"

redis是怎么采用的過期策略

  1. 惰性刪除+定期刪除
  2. 惰性刪除流程:在進行get或setnx等操作時,先檢查key是否過期,若過期,刪除key,然后執行相應操作;若沒過期,直接執行相應操作
  3. 定期刪除流程:遍歷每個數據庫,檢查當前庫中的指定個數個key(默認是每個庫檢查20個key,注意相當于該循環執行20次,循環體時下邊的描述),如果當前庫中沒有一個key設置了過期時間,直接執行下一個庫的遍歷,隨機獲取一個設置了過期時間的key,檢查該key是否過期,如果過期,刪除key,判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。

二、內存淘汰機制

1. 不進行數據淘汰(No Eviction)

  • noeviction:
    • 行為: 這是 Redis 的默認策略。當內存達到上限時,Redis 不會主動淘汰任何數據。
    • 結果: 如果此時有寫入請求(如?SET,?LPUSH?等),Redis 會返回錯誤(通常是?(error) OOM command not allowed when used memory > 'maxmemory')。讀取請求(如?GET)仍然可以正常執行。
    • 適用場景: 適用于數據量小且能精確控制內存,或者絕對不允許丟失任何數據的場景。需要應用程序自己處理內存溢出錯誤。

2. 基于過期時間的淘汰策略(針對設置了?expire?的 Key)

這些策略只會在設置了過期時間(TTL)的鍵中選擇淘汰目標。

  • volatile-lru:

    • 行為: 從設置了過期時間的鍵中,使用最近最少使用(Least Recently Used, LRU)算法淘汰最久未被訪問的鍵。
    • 特點: 優先保證長期未訪問的過期數據被淘汰,保留了經常訪問的熱點過期數據。
    • 適用場景: 緩存場景,其中大部分需要緩存的數據都設置了過期時間,希望保留熱點數據。
  • volatile-lfu:

    • 行為: 從設置了過期時間的鍵中,使用最少頻率使用(Least Frequently Used, LFU)算法淘汰訪問頻率最低的鍵。
    • 特點: LFU 算法比 LRU 更能反映數據的長期訪問熱度,能更好地保留高頻訪問的數據,即使它們最近一次訪問不是最新的。
    • 適用場景: 緩存場景,數據訪問模式存在明顯的熱點,且希望更精確地保留高頻訪問的過期數據。需要 Redis 4.0+。
  • volatile-ttl:

    • 行為: 從設置了過期時間的鍵中,淘汰剩余生存時間(TTL)最短的鍵。
    • 特點: 優先淘汰即將過期的數據。
    • 適用場景: 當希望數據盡可能在過期前被使用,但內存緊張時優先清理“快過期”的數據。效果可能不如?volatile-lru?或?volatile-lfu?理想。
  • volatile-random:

    • 行為: 從設置了過期時間的鍵中,隨機選擇一個鍵進行淘汰。
    • 特點: 實現簡單,性能開銷小,但淘汰沒有基于訪問模式,可能淘汰掉熱點數據。
    • 適用場景: 對淘汰算法要求不高,或者訪問模式非常隨機,且所有過期鍵價值相當的場景。

3. 基于所有鍵的淘汰策略(針對所有 Key,無論是否設置過期時間)

這些策略會考慮數據庫中的所有鍵(無論是否設置了過期時間)。

  • allkeys-lru:

    • 行為: 在所有鍵中,使用最近最少使用(LRU)算法淘汰最久未被訪問的鍵。
    • 特點: 會淘汰長期未訪問的任何數據,包括沒有設置過期時間的持久化數據。
    • 適用場景: 緩存場景,其中部分數據可能未設置過期時間,但仍希望基于訪問熱度進行淘汰。這是非常常用的緩存策略。
  • allkeys-lfu:

    • 行為: 在所有鍵中,使用最少頻率使用(LFU)算法淘汰訪問頻率最低的鍵。
    • 特點: 同樣能更好地保留高頻訪問的任何數據。
    • 適用場景: 緩存場景,數據訪問熱點明顯,希望最精確地保留高頻訪問數據,無論其是否過期。需要 Redis 4.0+。
  • allkeys-random:

    • 行為: 在所有鍵中,隨機選擇一個鍵進行淘汰。
    • 特點: 實現簡單,性能開銷最小,但完全不考慮訪問模式,可能淘汰掉重要的持久化數據。
    • 適用場景: 數據價值相對均勻,或者對數據丟失不敏感,追求極致性能的場景。

三、其他模塊對過期鍵的處理

生成RDB文件時

  1. 執行?save?或?bgsave?時 ,數據庫鍵空間中的過期鍵不會被保存在RDB文件中。

載入RDB文件時

  1. master 載入RDB時,文件中的未過期的鍵會被正常載入,過期鍵則會被忽略。
  2. slave 載入 RDB 時,文件中的所有鍵都會被載入,當同步進行時,會和Master 保持一致。

AOF 文件寫入時

  1. 數據庫鍵空間的過期鍵的過期但并未被刪除釋放的狀態會被正常記錄到AOF文件中,當過期鍵發生釋放刪除時,DEL也會被同步到?AOF文件中去。

主從同步過期key

  1. Master?刪除過期key之后,會向所有slave?服務器發送一個DEL命令,從服務器收到之后,會刪除這些Key。
  2. Slave?在被動的讀取過期鍵時,不會做出操作,而是繼續返回該鍵,只有當Master?發送?DEL?通知來,才會刪除過期鍵,這是統一、中心化的鍵刪除策略,保證主從服務器的數據一致性。

?推薦一個非常好用的工具集合:在線工具集合 - 您的開發助手

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

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

相關文章

NVIDIA Nsight Deep Learning Designer使用

一、關于產品 1.1 產品介紹 NVIDIA Nsight Deep Learning Designer 是一款面向 AI 推理開發者的可視化建模與優化工具。它支持基于 ONNX 格式的神經網絡模型編輯、結構可視化、性能分析與 TensorRT 引擎導出,幫助用戶更高效地設計、調優和部署高性能推理模型。該工…

Android 常見100道面試題(完整版)

一、基礎組件與核心原理Activity 相關Q1:請描述 Activity 的完整生命周期,從創建到銷毀經歷哪些關鍵方法?A:Activity 完整生命周期包括:onCreate(初始化)→ onStart(可見&#xff09…

Navicat 為 SQLite 數據庫設置密碼指南

Navicat 為 SQLite 數據庫設置密碼指南 在 SQLite 中設置密碼實際上是通過加密實現的,Navicat 使用 SQLCipher 擴展來提供數據庫加密功能。以下是詳細的操作方法和注意事項: 在 Navicat 中設置密碼(加密數據庫) 步驟 1&#xff1a…

Spring Framework:Java 開發的基石與 Spring 生態的起點

在 Java 技術領域,Spring Framework 無疑是一座里程碑式的存在。它不僅徹底改變了 Java 企業級應用的開發模式,更以其為核心衍生出了龐大的 Spring 生態系統,成為無數開發者構建應用的首選技術棧。本文將以 Spring Framework 為核心&#xff…

Unity中 terriaria草,在攝像機拉遠的時候就看不見了,該怎么解決

在 Unity 中,當攝像機拉遠時草就看不見,可能是由于地形細節距離設置、攝像機裁剪平面設置或 LOD(Level of Detail)設置不當導致的。以下是具體的解決方法:調整地形細節距離:選中場景中的地形對象&#xff0…

驅動開發系列63 - 編譯 NVIDIA 的 open-gpu-kernel-modules 開源內核驅動及搭建調試環境

目錄 一:通過apt方式安裝nvidia 驅動 二:通過 .run 方式安裝nvidia驅動 三:編譯安裝nvidia開源內核驅動 四:驗證和調試 五:卸載驅動 1. 以apt方式安裝nvidia 驅動的卸載方法 2. 以.run方式安裝nvidia驅動的卸載方法 六:安裝CUDA環境 一:通過apt方式安裝nvidia 驅動…

Rocky Linux 9.2:從 /home 分區釋放 10G 空間擴容到 / 根分區

在日常運維中,常見的問題之一就是安裝的軟件過多,導致根分區(/)空間不足,而其他分區(例如 /home)卻有大量閑置空間。本文將演示如何在 Rocky Linux 9.2 上,通過 LVM(Logi…

iis/iis express無需手動配置handlers,僅將 DLL 放入bin目錄即可處理 HTTP 請求的功能

以下是使用VB.NET實現的方案,分別針對傳統ASP.NET(System.Web)和ASP.NET Core 兩種環境,實現無需手動配置handlers,僅將 DLL 放入bin目錄即可處理 HTTP 請求的功能。 一、傳統ASP.NET(System.Web&#xff…

【DP】單詞的劃分

題目描述 有一個很長的由小寫字母組成字符串。為了便于對這個字符串進行分析,需要將它劃分成若干個部分,每個部分稱為一個單詞。出于減少分析量的目的,我們希望劃分出的單詞數越少越好。你就是來完成這一劃分工作的。 輸入 第一行&#xff0c…

UniApp 中使用 tui-xecharts插件(或類似圖表庫如 uCharts)

要在 UniApp 中使用 tui-xecharts插件(或類似圖表庫如 uCharts),需遵循以下步驟。以下流程以 ??uCharts??(官方推薦的高性能跨平臺圖表庫)為例,因其在 UniApp 生態中更成熟且文檔完善。若需使用 tui-xe…

順序表 —— OJ題

在上一篇文章中簡單介紹了順序表,這一篇文章講解下一個比較經典的題:楊輝三角先看一下什么是楊輝三角下面解釋:大概就是這個規律。而 ta 其實就是二維數組 即:0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1然后看一下這個題的要求…

基于單片機的防酒駕系統設計

一、引言1.1 研究背景與意義隨著社會經濟的快速發展,汽車保有量持續攀升,道路交通安全問題愈發凸顯。酒后駕駛作為交通事故的主要誘因之一,嚴重威脅著人們的生命財產安全。據統計,全球每年因酒駕造成的交通事故死亡人數高達數十萬…

Redis面試精講 Day 22:Redis布隆過濾器應用場景

【Redis面試精講 Day 22】Redis布隆過濾器應用場景 在高并發、大數據量的互聯網系統中,如何高效判斷一個元素是否存在于集合中,是緩存設計中的關鍵問題。尤其是在面對緩存穿透——即惡意或無效請求頻繁查詢不存在的數據,導致數據庫壓力劇增—…

Spark Shuffle中的數據結構

文章目錄1.Shuffle中的三種數據結構2.AppendOnlyMap原理2.1 聚合2.2 擴容2.3 排序2.4 為什么是數組?3.ExternalAppendOnlyMap原理3.1 工作原理3.2 AppendOnlyMap大小估計3.2.1 為什么要估計大小?3.2.2 估計大小淺析3.2.2.1 什么時候采樣?3.2.…

告別在線轉換風險:本地運行的PDF轉Word技術評測

Word文檔(.docx)是可編輯的主流辦公格式,支持靈活修改文字、排版、圖片、表格等。它的體積僅有5.5M,小巧不占空間,且轉換不限文件大小,隨用隨轉,毫無限制。初次使用需完成一次安裝,之…

整體設計 符號學與詮釋學融合的整體設計框架(本篇暫時命名)--PromptPilot (助手)答問之1

說明 本系列篇(分多篇)是就前面 已經和騰訊元寶就“整體設計”的討論內容 再和 PromptPilot (助手)的再次溝通。但內容做了部分修正一邊 更準確和完整。摘要(CSDN的AI助手提取的)符號學與詮釋學融合的整體設…

Font shape `TU/ptm/m/n‘ undefined(Font) using `TU/lmr/m/n‘ instead

一、警告內容 這是 LaTeX 字體選擇機制輸出的信息。我們可以把 TU/ptm/m/n 分解來看: TU → 編碼 (font encoding) TU 表示 Unicode TeX encoding,即新版 XeLaTeX/LuaLaTeX 下的 Unicode 字體編碼。 ptm → 字體族 (family) ptm 代表 Times 字體 (PostS…

拒絕造輪子(C#篇)ZLG CAN卡驅動封裝應用

拒絕造輪子(C#篇)ZLG CAN卡驅動封裝應用 今天給大家介紹一個封裝完善的CAN卡類。 背景 在面對常規開發場景,開發者對復雜SDK進行封裝和測試。閱讀相關開發資料和理解SDK的DEMO程序。 開篇 如果你也有同樣的煩惱,那就來看看今…

機器學習相關算法:回溯算法 貪心算法 回歸算法(線性回歸) 算法超參數 多項式時間 樸素貝葉斯分類算法

整理了一張“機器學習相關算法與概念速覽表”,既包含定義,也配上了容易記住的例子,讓大家一眼就能抓住它們的特點: 🤖 機器學習與相關算法&概念 名稱定義生動例子典型應用場景回溯算法通過不斷嘗試和回退來尋找問…

vue+微信小程序 五角星

說明&#xff1a;這個是先畫出一個72度菱形&#xff0c;長中長線和短中長線按照一定比例&#xff0c;然后把菱形分層十份&#xff0c;最后再把菱形進行旋轉形成五角星&#xff0c;最后顯示標簽&#xff0c;因為一直對不上所以對標簽做了點操作 <template><view class&…