当前位置: 首页 > article >正文

Redis Key过期策略

概述

  Redis的Key过期策略是其内存管理系统的核心组成部分,主要包括「被动过期」、「主动过期」和「内存淘汰」三个机制。其中「内存淘汰」相关内容已经在上一篇「Redis内存淘汰策略」中进行了详细的讲解,有信兴趣的同学可以在回顾上一篇文章。本文将着重讲解Redis的Key过期策略,从实现原理、工作流程到最佳实践进行全面解析。


Redis Key过期策略

  Redis采用多策略组合的方式管理Key过期,主要包括三种机制:定时删除惰性删除定期删除
  下面将分别对这三种key过期机制进行实现原理、优缺点、Redis采用的策略、以及RDB/AOF对不同过期策略的处理上的讲解。

定时删除

实现原理
  在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key过期时间来临时,对key进行删除。
优点
  1. 内存友好,可以及时清除过期的数据
缺点
  1. cpu不友好,会占用大量cpu资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  2. 定时器的创建耗时,若为每一个设置过期时间key创建一个定时器(将会产生大量的定时器),性能影响严重。
  3. Redis未采用此策略。


惰性删除

实现原理
  只有当访问key时,才会判断该key是否已经是过期(触发expireIfNeeded()检查),过期则清除。
  优点
  1. cpu友好,零额外开销
  2. 删除操作精准
缺点
  1.内存泄漏风险:不访问的过期Key永远存在。极端情况下可能会出现大量过期key没有再被访问,从而不会被删除,占用大量无效内存。


定期删除

实现原理
  每隔一定时间,扫描一定数量在数据库中expires字典(过期字典)中一定数量的key,并清除其中已过期的key。

工作机制
  1. 周期性执行activeExpireCycle()
  2. 随机抽取部分过期字典中的Key检查
  3. 采用自适应算法控制CPU消耗

核心算法

def activeExpireCycle():while True:# 每次随机检查20个Keyfor i in range(20):key = random.choice(expires_dict)if key.expire_time < now:delete_key(key)# 动态退出条件if checked_keys < 20*25%:  # 过期率<25%则退出break

优点
  1.该策略是前两者的一个折中方案,通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得cpu和内存资源达到最优的平衡效果。
  2.通过限制删除的时长和频率,来减少删除操作对cpu时间的占用 — 解决「定时删除」的缺点
  3.定期删除过期key — 解决「惰性删除」的缺点

缺点
  1.在内存友好方面,不如「定时删除」。
  2.在cpu时间友好方面,不如「惰性删除」。

难点
  1.合理设置操作的执行时长(每次删除执行多长时间)和执行频率(每隔多久时间做一次删除),这个需要各个业务场景根据实际情况进行动态调整。


Redis采用的策略

 Redis采用**「惰性删除」** + **「定期删除」**的混合策略

混合策略架构
混合策略架构.png

「惰性删除」 + 「定期删除」策略

惰性删除流程
  1.在进行get或setnx等操作时,先检查key是否过期。
  2.若过期,则删除key,然后执行相应操作。
  3.若没过期,则直接执行相应操作。

定期删除流程
  1.遍历每个数据库(即redis.conf中配置的“database”数量,默认为16)。
  2.检查当前库中指定个数key(默认是每个库检查20个key,相当于循环执行20次)。
   a. 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历。
   b. 随机获取一个设置了过期时间的key,检查key是否过期,如过期,删除key。
   c. 判断定期删除操作是否已经达到指定时长,若达到,则退出定期删除。
注意事项
  定期删除,在程序中有一个全局变量current_db来记录下一个将要便利的库。假设有16个库,这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第 11库开始遍历。


持久化对过期策略的处理

RDB对过期策略的处理

说明:过期key对RDB没有影响
原理
  1.从内存持久化数据到RDB文件
主节点
  a. 生成RDB快照时会主动过滤已过期的Key。
  b. 仅持久化未过期的Key-value对。
从节点
  a. 即使接收到的RDB文件包含未实际过期的Key。
  b. 加载时仍会执行过期检查(双重保障)。

关键源码

// rdb.c 源码关键逻辑
int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime) {if (expiretime != -1 && expiretime < mstime()) {return 0; // 跳过已过期的Key}// 保存未过期的Key...
}

2.从RDB文件恢复数据到内存
全量加载流程:
  a. 清空当前数据库
  b. 解析RDB文件内容
  c. 对每个Key执行expireIfNeeded()检查
  c. 仅加载未过期的Key


AOF对过期策略的处理

说明:过期key对AOF没有影响
原理
1.从内存持久化数据到AOF文件

正常AOF追加模式
  a. AOF会将对应Key的操作一并写入文件中

操作类型AOF记录内容
Key设置过期PEXPIREAT key timestamp
Key自然过期DEL key(实际由propagateExpire()生成)
手动删除直接记录DEL key

AOF重写时
  a. 重写时,会先判断Key是否过期,已过期的Key不会重写到AOF文件

与RDB的区别
  a. 仍会记录Key的过期时间(PEXPIREAT)
  b. 但实际数据只有未过期Key会被写入


复制场景下的特殊处理

主从复制流程

节点角色过期Key处理方式
主节点惰性删除+定期删除
从节点仅依赖主节点的DEL同步

关键机制:
  a. 主节点过期后会向从节点传播DEL命令
  b. 从节点不会主动删除Key(即使已过期)
  c. 3.2+版本引入replica-ignore-expire配置(默认关闭)


数据一致性风险

场景:
  1. Key在主节点过期但尚未同步到从节点
  2. 此时主节点宕机,从节点晋升后:
  3. RDB加载:会重新检查过期
  4. AOF回放:依赖记录的DEL命令


总结对比表

持久化方式生成时处理加载时处理复制传播
RDB过滤过期Key二次检查全量同步
AOF记录DEL命令按序重放增量同步
混合模式RDB部分过滤组合加载混合同步

相关文章:

Redis Key过期策略

概述 Redis的Key过期策略是其内存管理系统的核心组成部分&#xff0c;主要包括「被动过期」、「主动过期」和「内存淘汰」三个机制。其中「内存淘汰」相关内容已经在上一篇「Redis内存淘汰策略」中进行了详细的讲解&#xff0c;有信兴趣的同学可以在回顾上一篇文章。本文将着重…...

【C/C++】实现固定地址函数调用

在 C 里&#xff0c;函数地址在程序运行期间通常是固定的&#xff0c;不过在动态链接库&#xff08;DLL&#xff09;或者共享库&#xff08;SO&#xff09;中&#xff0c;函数地址可能会因为地址空间布局随机化&#xff08;ASLR&#xff09;而改变。所以我们想要通过地址直接调…...

多模态大语言模型arxiv论文略读(109)

Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文标题&#xff1a;Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文作者&#xff1a;Wenwen Zhuang, Xin Huang, Xiantao Z…...

性能优化笔记

性能优化转载 https://www.cnblogs.com/tengzijian/p/17858112.html 性能优化的一般策略及方法 简言之&#xff0c;非必要&#xff0c;不优化。先保证良好的设计&#xff0c;编写易于理解和修改的整洁代码。如果现有的代码很糟糕&#xff0c;先清理重构&#xff0c;然后再考…...

bat批量去掉本文件夹中的文件扩展名

本文本夹内 批量去掉本文件夹中的文件扩展名 假如你有一些文件&#xff0c;你想去掉他们的扩展名 有没有方便的办法呢 今天我们就分享一种办法。 下面&#xff0c;就来看看吧。 首先我们新建一个记事本&#xff0c;把名字改为&#xff0c;批量去掉本文件夹中的文件扩展名.txt 然…...

基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新

提问 #! /usr/bin/env python3from control_planner import usvParam as P from control_planner.courseController import courseLimitationimport tf_transformations # ROS2没有自带tf.transformations, 需装第三方库 import rclpy from rclpy.node import Node from pid_…...

Scrapy爬虫教程(新手)

1. Scrapy的核心组成 引擎&#xff08;engine&#xff09;&#xff1a;scrapy的核心&#xff0c;所有模块的衔接&#xff0c;数据流程梳理。 调度器&#xff08;scheduler&#xff09;&#xff1a;本质可以看成一个集合和队列&#xff0c;里面存放着一堆即将要发送的请求&#…...

数据可视化大屏案例落地实战指南:捷码平台7天交付方法论

分享大纲&#xff1a; 1、落地前置&#xff1a;数据可视化必备的规划要素 2、数据可视化双路径开发 3、验证案例&#xff1a;数据可视化落地成效 在当下数字化转型浪潮中&#xff0c;数据可视化建设已成为关键环节。数据可视化大屏的落地&#xff0c;成为企业数据可视化建设的难…...

第五篇:Go 并发模型全解析——Channel、Goroutine

第五篇:Go 并发模型全解析——Channel、Goroutine 一、序章:Java 的并发往事 在 Java 世界中,说到“并发”,你可能立马想到以下名词:Thread、Runnable、ExecutorService、synchronized、volatile。再复杂点,ReentrantLock、CountDownLatch、BlockingQueue 纷纷登场,仿…...

锁的艺术:深入浅出讲解乐观锁与悲观锁

在多线程和分布式系统中&#xff0c;数据一致性是一个核心问题。锁机制作为解决并发冲突的重要手段&#xff0c;被广泛应用于各种场景。乐观锁和悲观锁是两种常见的锁策略&#xff0c;它们在设计理念、实现方式和适用场景上各有特点。本文将深入探讨乐观锁和悲观锁的原理、实现…...

在网页加载时自动运行js的方法(2025最新)

在网页加载时自动运行JavaScript方法有多种实现方式&#xff0c;以下是常见的几种方法&#xff1a; 1. ​​使用 DOMContentLoaded 事件​​ 当初始HTML文档完全加载和解析后触发&#xff08;无需等待图片等资源加载&#xff09;&#xff1a; document.addEventListener(DOMC…...

在Windows下编译出llama_cpp_python的DLL后,在虚拟环境中使用方法

定位编译生成的文件 在VS2022编译完成后&#xff0c;在构建目录&#xff08;如build/Release或build/Debug&#xff09;中寻找以下关键文件&#xff1a; ggml.dll、ggml_base.dll、ggml_cpu.dll、ggml_cuda.dll、llama.dll&#xff08;核心动态链接库&#xff09; llama_cp…...

CSS radial-gradient函数详解

目录 基本语法 关键参数详解 1. 渐变形状&#xff08;Shape&#xff09; 2. 渐变大小&#xff08;Size&#xff09; 3. 中心点位置&#xff08;Position&#xff09; 4. 颜色断点&#xff08;Color Stops&#xff09; 常见应用场景 1. 基本圆形渐变 2. 椭圆渐变 3. 模…...

n8n 自动化平台 Docker 部署教程(附 PostgreSQL 与更新指南)

n8n 自动化平台 Docker 部署教程&#xff08;附 PostgreSQL 与更新指南&#xff09; n8n 是一个强大的可视化工作流自动化工具&#xff0c;支持无代码或低代码地集成各种服务。本文将手把手教你如何通过 Docker 快速部署 n8n&#xff0c;并介绍如何使用 PostgreSQL、设置时区以…...

关于datetime获取时间的问题

import datetime print(datetime.now())如果用上述代码&#xff0c;会报错&#xff1a; 以下才是正确代码&#xff1a; from datetime import datetime print(datetime.now()) 结果&#xff1a; 如果想格式化时间&#xff0c;使用代码&#xff1a; from datetime import da…...

前端面试五之vue2基础

1.属性绑定v-bind&#xff08;&#xff1a;&#xff09; v-bind 是 Vue 2 中用于动态绑定属性的核心指令&#xff0c;它支持多种语法和用法&#xff0c;能够灵活地绑定 DOM 属性、组件 prop&#xff0c;甚至动态属性名。通过 v-bind&#xff0c;可以实现数据与视图之间的高效同…...

使用python实现奔跑的线条效果

效果&#xff0c;展示&#xff08;视频效果展示&#xff09;&#xff1a; 奔跑的线条 from turtle import * import time t1Turtle() t2Turtle() t3Turtle() t1.hideturtle() t2.hideturtle() t3.hideturtle() t1.pencolor("red") t2.pencolor("green") t3…...

Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS

Oracle 审计参数&#xff1a;AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS 一 AUDIT_TRAIL 参数 1.1 参数功能 AUDIT_TRAIL 是 Oracle 数据库中最核心的审计控制参数&#xff0c;决定审计记录的存储位置和记录方式。 1.2 参数取值及含义 取值说明适用场景NONE禁用数据库审计测试环…...

Android LinearLayout、FrameLayout、RelativeLayout、ConstraintLayout大混战

一、为什么布局性能如此重要&#xff1f; 在Android应用中&#xff0c;布局渲染耗时直接决定了界面的流畅度。根据Google官方数据&#xff0c;超过60%的卡顿问题源于布局性能不佳。本文将彻底解析三大传统布局的性能奥秘&#xff0c;并提供可直接落地的优化方案。 二、三大布局…...

Unity版本使用情况统计(更新至2025年5月)

UWA发布&#xff5c;本期UWA发布的内容是Unity版本使用统计&#xff08;第十六期&#xff09;&#xff0c;统计周期为2024年11月至2025年5月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参…...

GPUCUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999&#xff1a;GPU 的诞生&#xff1a;光栅化&#xff08;Rasterization&#xff09;3D 渲染算法的硬件化实现之路 学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现&#xff1a;OpenGL 3D 渲染管线设计 1. 顶点处理&…...

人机融合智能 | 可穿戴计算设备的多模态交互

可穿戴计算设备可以对人体以及周围环境进行连续感知和计算,为用户提供随时随地的智能交互服务。本章主要介绍人机智能交互领域中可穿戴计算设备的多模态交互,阐述以人为中心的智能穿戴交互设计目标和原则,为可穿戴技术和智能穿戴交互技术的设计提供指导,进而简述支持智能穿戴交…...

Impromptu VLA:用于驾驶视觉-语言-动作模型的开放权重和开放数据

25年5月来自清华和博世的论文“Impromptu VLA: Open Weights and Open Data for Driving Vision-Language-Action Models”。 用于自动驾驶的“视觉-语言-动作” (VLA) 模型前景光明&#xff0c;但在非结构化极端场景下却表现不佳&#xff0c;这主要是由于缺乏有针对性的基准测…...

AI智能体,为美业后端供应链注入“智慧因子”(4/6)

摘要&#xff1a;本文深入剖析美业后端供应链现状&#xff0c;其产品具有多样性、更新换代快等特点&#xff0c;原料供应和生产环节也面临诸多挑战。AI 智能体的登场为美业后端供应链带来变革&#xff0c;包括精准需求预测、智能化库存管理、优化生产计划排程、升级供应商管理等…...

跨平台资源下载工具:res-downloader 的使用体验

一款基于 Go Wails 的跨平台资源下载工具&#xff0c;简洁易用&#xff0c;支持多种资源嗅探与下载。res-downloader 一款开源免费的下载软件(开源无毒、放心使用)&#xff01;支持Win10、Win11、Mac系统.支持视频、音频、图片、m3u8等网络资源下载.支持视频号、小程序、抖音、…...

ps蒙版介绍

一、蒙版的类型 Photoshop中有多种蒙版类型&#xff0c;每种适用于不同的场景&#xff1a; 图层蒙版&#xff08;Layer Mask&#xff09; 作用&#xff1a;控制图层的可见性&#xff0c;黑色隐藏、白色显示、灰色半透明。特点&#xff1a;可随时编辑&#xff0c;适合精细调整。…...

数据湖是什么?数据湖和数据仓库的区别是什么?

目录 一、数据湖是什么 &#xff08;一&#xff09;数据湖的定义 &#xff08;二&#xff09;数据湖的特点 二、数据仓库是什么 &#xff08;一&#xff09;数据仓库的定义 &#xff08;二&#xff09;数据仓库的特点 三、数据湖和数据仓库的区别 &#xff08;一&#…...

用Ai学习wxWidgets笔记——在 VS Code 中使用 CMake 搭建 wxWidgets 开发工程

声明&#xff1a;本文整理筛选Ai工具生成的内容辅助写作&#xff0c;仅供参考 >> 在 VS Code 中使用 CMake 搭建 wxWidgets 开发工程 下面是一步步指导如何在 VS Code 中配置 wxWidgets 开发环境&#xff0c;包括跨平台设置&#xff08;Windows 和 Linux&#xff09;。…...

【深度学习新浪潮】如何入门三维重建?

入门三维重建算法技术需要结合数学基础、计算机视觉理论、编程实践和项目经验,以下是系统的学习路径和建议: 一、基础知识储备 1. 数学基础 线性代数:矩阵运算、向量空间、特征分解(用于相机矩阵、变换矩阵推导)。几何基础:三维几何(点、线、面的表示)、射影几何(单…...

Android实现点击Notification通知栏,跳转指定activity页面

效果 1、点击通知栏通知&#xff0c;假如app正在运行&#xff0c;则直接跳转到指定activity显示具体内容&#xff0c;在指定activity中按返回键返回其上一级页面。 2、点击通知栏通知&#xff0c;假如app已经退出&#xff0c;先从SplashActivity进入&#xff0c;显示app启动界…...