Redis 的 Key 过期后不会立即被删除。Redis 采用了一种结合 ​惰性删除 (Lazy Expiration)​​ 和 ​定期删除 (Periodic Expiration)​​ 的策略来管理过期 Key 的回收,这是为了在内存管理、性能和 CPU 开销之间取得平衡。

📌 Redis 过期 Key 删除的两种策略

🔍 1. ​惰性删除 (Lazy Expiration)​
  • 触发时机​:当客户端尝试访问一个 Key 时,Redis 会先检查这个 Key 是否已过期。
  • 执行过程​:
    • 如果 Key 已过期,Redis 会立即删除它,并返回 nil 给客户端(就像这个 Key 不存在一样)。
    • 如果 Key 未过期,则正常返回其值。
  • 优点​:
    • CPU 友好​:只在访问时检查,不占用额外 CPU 资源扫描过期 Key。
    • 简单高效​:对未过期的 Key 没有额外开销。
  • 缺点​:
    • 内存可能未及时释放​:如果某个过期 Key 长时间不被访问,它会一直占用内存,直到被访问或通过定期删除被清理。这可能导致内存浪费(内存泄漏假象)。
⏰ 2. ​定期删除 (Periodic Expiration / Probabilistic Algorithm)​
  • 触发时机​:Redis 会 ​周期性​ 地(默认每秒运行 10 次,可通过 hz 配置调整)随机抽取一部分设置了过期时间的 Key 进行检查。
  • 执行过程​:
    1. 从设置了过期时间的 Key 集合中,​随机抽取​ 一定数量的 Key(数量由配置控制)。
    2. 检查这些被抽中的 Key 是否过期。
    3. 删除所有已过期的 Key。
    4. 如果本轮抽查中过期 Key 的比例 ​超过 25%​,则立即重复步骤 1​(继续抽查并删除),直到比例低于 25% 或达到时间/次数限制。
  • 优点​:
    • 减少内存浪费​:即使 Key 不被访问,也有机会被清理掉。
    • 可控的 CPU 开销​:通过控制抽查频率 (hz) 和每次抽查的数量,可以限制对 CPU 的影响。
  • 缺点​:
    • 非实时​:过期 Key 不会在过期那一刻被立即删除,会有一定的延迟(通常在秒级)。
    • 可能遗漏​:如果过期 Key 比例很低或运气不好没被抽中,可能暂时不会被删除。

📊 总结:Key 何时会被删除?

场景删除机制延迟性
Key 过期后被访问惰性删除立即删除实时(访问时触发)
Key 过期后未被访问,但被定期删除抽中定期删除清理秒级延迟(取决于抽查频率和运气)
Key 过期后长期未被访问且未被抽中可能滞留内存不确定(直到被访问或抽中)

⚠️ 注意事项与影响

  1. 内存占用​:大量过期 Key 未被及时删除会导致 Redis ​实际内存使用量高于有效数据量。监控时需关注 expired_keys (累计删除数) 和 evicted_keys (因内存不足被淘汰数) 指标。
  2. 内存淘汰策略​:如果 Redis 配置了 maxmemory 且内存不足,即使 Key 未过期也可能根据策略(如 allkeys-lru)被淘汰。而过期 Key 滞留会加速触发内存淘汰,可能导致有用的 Key 被误删。
  3. 性能影响​:定期删除的 CPU 开销取决于 hz 设置和过期 Key 数量。过高频率的抽查会增加 CPU 负担。
  4. 命令影响​:像 KEYS * 或 SCAN 命令可能会返回已过期但尚未被删除的 Key(但在返回前会触发惰性删除)。

🛠️ 如何应对过期 Key 滞留问题?

  1. 监控告警​:监控 Redis 的 used_memoryexpired_keysevicted_keys 等指标,设置内存使用阈值告警。
  2. ​**调整 hz**​:适当增加 hz 值(如从 10 调整到 100)可提高定期删除频率,加速清理过期 Key,但会增加 CPU 负载(需权衡)。
  3. 避免大量 Key 同时过期​:对大量 Key 设置过期时间时,添加随机因子(如 TTL = base + random(0, 300)),防止集中过期导致内存陡增或定期删除压力大。
  4. 使用 MEMORY PURGE 命令 (Redis 4.0+)​​:手动触发内存清理(非标准命令,部分云服务商支持)。
  5. 升级 Redis 版本​:新版 Redis 在内存管理和过期策略上可能有优化(如 Redis 6.0 的惰性删除线程)。

💎 结论

Redis 为了性能牺牲了过期 Key 删除的实时性。理解其 ​惰性删除 + 定期删除​ 的组合策略,对于诊断内存异常、优化配置和保障系统稳定性至关重要。务必监控内存指标,并根据业务场景调整相关参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96275.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96275.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96275.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 React 19 的四种组件通信方法

注意:使用的是UI库是 antd-mobile1.父子级组件通信父组件单向数据流:数据从父组件流向子组件。支持多种数据类型:字符串、数字、对象、数组、函数等。只读性:子组件不能直接修改 props 中的数据。import { useState } from react …

OC-单例模式

文章目录单例模式定义特点使用原因缺点模式介绍懒汉模式同步锁实现dispatch_once饿汉模式实现总结懒汉模式优点缺点饿汉模式优点缺点单例模式 定义 单例模式,简单的说就是一个类始终只对应同一个对象,每次获取这个类的对象获得的都是同一个实例 如果一…

[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案

抗量子紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案 论文信息信息类别具体内容论文原标题SM3-OTS: 基于国密算法SM3的紧凑型后量子一次签名方案主要作者杨亚涛、殷方锐、陈亮宇、潘登研究机构1. 北京电子科技学院 电子与通信工程系(北京 1…

C语言-指针用法概述

目录 1.指针基础概念 2. 指针与数组 3. 指针作为函数参数 4. 动态内存分配 5. 指针的高级用法 6. 常见错误与注意事项 7. 指针数组 vs. 数组指针 8.总结与建议 本文主要作为指针用法的复习,会对指针的大致用法进行举例和概述。 1.指针基础概念 ​什…

Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)

简介 语音识别(Automatic Speech Recognition, ASR)是将人类的语音信号自动转换为对应文字的技术,它使计算机能够“听懂”人说的话,是人机语音交互的核心技术,广泛应用于智能助手、语音输入、客服系统等场景。 现在我…

第3周 机器学习课堂记录

1.学习问题的分类有监督的学习分类回归无监督学习聚类密度估计:确定输入空间中的数据的分布可视化:把高位空间中的数据投影到二维或三维空间强化学习不给定最优输出的示例,而是通过试错发现最优输出2.泛化versus过度拟合背景引入:…

消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka

一、引言:为什么需要关注高级特性? 在现代分布式系统架构中,消息队列(Message Queue)已成为不可或缺的核心组件。初级使用消息队列可能只需几行代码就能实现基本功能,但要真正发挥其在大规模生产环境中的威…

【GPT入门】第65课 vllm指定其他卡运行的方法,解决单卡CUDA不足的问题

【GPT入门】第65课 vllm指定其他卡运行的方法,解决单卡CUDA不足的问题1.原理说明:2.实践1.原理 要将 vllm 部署在第二张 GPU 卡上(设备编号为 1),只需在命令前添加 CUDA_VISIBLE_DE…

Spring Boot Actuator自定义指标与监控实践指南

Spring Boot Actuator自定义指标与监控实践指南 本篇文章以生产环境实战经验为主线,结合某电商系统的业务场景,讲解如何在Spring Boot Actuator中添加并暴露自定义指标,并使用Prometheus和Grafana进行完整的监控与告警配置。 一、业务场景描述…

Vue报错<template v-for=“option in cardOptions“ :key=“option.value“>

在Vue项目中遇到报错&#xff0c;原因是模板中使用了<template>标签内的v-for指令&#xff0c;而当前Vue版本不支持此用法。解决方案是移除<template>标签&#xff0c;直接在<el-option>上使用v-for。同时优化计算属性cardOptions&#xff0c;使其能够兼容历…

人工智能学习:Transformer结构中的规范化层(层归一化)

Transformer结构中的规范化层(层归一化) 一、规范化层(层归一化)介绍 概念 层归一化(Layer Normalization) 是一种用于提高深度神经网络训练稳定性和加速收敛的技术,广泛应用于现代深度学习模型中,尤其是在Transformer等序列建模网络中。它通过对每一层的输出进行归一化…

盼之代售 最新版 decode__1174

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分python代码 cp1 execj…

Transformer系列 | Pytorch复现Transformer

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、Transformer和Seq2Seq 在之前的博客中我们学习了Seq2Seq(深度学习系列 | Seq2Seq端到端翻译模型)&#xff0c;知晓了Attention为RNN带来的优点。那么有没有…

【MySQL】常用SQL语句

介绍常用的DDL语句、DML语句基本语法分号结尾使用空格和缩进不区分大小写--或#注释单行内容 /*注释多行内容*/DDL数据定义语句&#xff1a;定义数据库、表、字段一、操作库-- 创建库create database db1;-- 创建库是否存在&#xff0c;不存在则创建create database if not exi…

云手机就是虚拟机吗?

云手机并非等同于虚拟机&#xff0c;尽管二者存在一定相似性&#xff0c;但有着诸多区别&#xff0c;以下从多个方面来分析&#xff1a;云手机是一种基于云计算技术&#xff0c;将云端服务器虚拟化为手机设备&#xff0c;用户能通过网络远程操控的虚拟手机服务&#xff0c;它从…

准确--Nginx 1.28.0 安装与配置流程

Nginx 1.28.0 安装与配置流程 1. 下载与解压 cd ~ wget http://nginx.org/download/nginx-1.28.0.tar.gz tar -zxvf nginx-1.28.0.tar.gz cd nginx-1.28.02. 配置编译参数 ./configure \--prefix/home/ynnewweb/nginx \--with-http_ssl_module \--with-http_gzip_static_module…

无标记点动捕新范式:Xsens系统助力人形机器人实现毫米级动作复刻

Xsen搭载Manus数据手套在机器人操作与机器学习中的应用当前&#xff0c;人形机器人正加速向工业装配、家庭陪护、仓储物流等场景渗透&#xff0c;而 “如何让机器人的动作既符合人类运动规律&#xff0c;又能实现高精度执行” 成为制约其落地的核心瓶颈。Xsens 高精度全身动捕系…

mysql57超管root忘记密码怎么办

目录 背景 1.首先停止数据库 2.使用免密模式启动 3.修改密码 3.1刷新权限配置 3.2修改密码 4.杀掉mysql 5.重新正常启动mysql 6.查看mysql状态 7.验证 7.1首先服务器本地验证 7.2远程验证 背景 数据库密码忘记了,急的抓耳挠腮,怎么也想不起来,于是就开始重置吧 1.…

RESTful API:@RequestParam与@PathVariable实战对比

RequestParam vs PathVariable 在删除和查找操作中的使用差异 在项目实战中&#xff0c;选择使用 RequestParam 还是 PathVariable 来接收ID参数&#xff0c;通常基于以下几个考虑因素&#xff1a; 1. RESTful API 设计原则 查找操作使用 PathVariable GetMapping("/depts…

剧本杀小程序系统开发:开启沉浸式社交娱乐新纪元

在当今数字化浪潮席卷的时代&#xff0c;社交娱乐方式正经历着前所未有的变革。剧本杀&#xff0c;这一融合了角色扮演、推理悬疑与社交互动的线下娱乐项目&#xff0c;近年来迅速风靡全国&#xff0c;成为年轻人热衷的社交新宠。而随着移动互联网的蓬勃发展&#xff0c;剧本杀…