当前位置: 首页
数据库
Redis Key过期删除策略深度解析与实战总结

Redis Key过期删除策略深度解析与实战总结

时间:2026-07-28
转载

Redis采用惰性删除与定期删除组合策略:访问时检查并删除过期键,同时定期随机抽检并清理过期键,平衡CPU与内存。内存达上限时依据淘汰策略(如LRU、LFU)强制腾空间。该机制兼顾效率与资源控制。

Redis 的 Key 过期删除策略,堪称其内存管理机制中最引人入胜、也最受面试官青睐的模块。它并非依赖单一规则清理过期数据,而是采用一套组合拳:被动删除与主动删除双管齐下。这套设计究竟如何运作?让我们一步步深入拆解。

1. 被动删除(惰性删除 - Lazy Expiration)

工作原理
通俗来说就是:你不找我,我就不删。当客户端发起请求、访问某个 Key 时,Redis 会先检查该 Key 是否已过期。若已过期,立即删除并返回 nil——仿佛它从未存在过。若未过期,则正常返回数据。

优点
对 CPU 极其友好。只有在被访问的时刻才消耗资源,其他时间完全闲置。简单直接,不会干扰那些无人问津的 Key。

缺点
对内存不太友好。如果某些过期 Key 永远无人访问,它们就会一直滞留在内存中。极端情况下,可能导致内存浪费甚至“泄露”。

2. 主动删除(定期删除 - Periodic Expiration)

工作原理
既然仅靠被动删除不可靠,Redis 还会主动出击。它以固定频率(默认每秒 10 次)执行以下步骤:

  1. 随机抽检:从设置了过期时间的 Key 集合中,随机挑选 20 个。
  2. 过期清理:将这 20 个中已过期的 Key 删除。
  3. 动态循环:若本次抽检中超过 25% 的 Key 已过期,说明过期 Key 积压严重,需要重复步骤 1 和 2。
  4. 时间阀值:为防止影响主线程,每次扫描最多持续 25ms。时间一到,无论是否清理完毕,立即停止。

相关配置参数(在 redis.conf 中):

# 每秒执行过期扫描的次数(默认 10)
hz 10

# 每次扫描的 CPU 时间百分比上限(默认 25%)
# 实际上每次扫描最多 25ms(1000ms / hz * 25%)

优点
能有效减少内存中过期 Key 的堆积,在 CPU 消耗与内存占用之间找到不错的平衡点。

缺点
并非实时清理,可能存在某个 Key 已过期几分钟却未被扫描到的情况。而且,定期执行本身也会增加一定的 CPU 开销。

3. 内存淘汰策略(Eviction Policies)

如果说前两种策略是“日常保洁”,那么当内存真正吃紧时——即达到 maxmemory 限制——Redis 会启动最后防线:根据你配置的淘汰策略强行腾出空间。

# 内存限制(默认不限制)
maxmemory

# 淘汰策略
maxmemory-policy

可选的淘汰策略有以下几种:

策略描述适用场景
noeviction不淘汰,直接返回错误数据绝对不能丢失
allkeys-lru从所有 Key 中选出最近最少使用的淘汰需要缓存效果
volatile-lru从设置了过期时间的 Key 中选出最近最少使用的淘汰混合使用
allkeys-random从所有 Key 中随机淘汰所有 Key 同等重要
volatile-random从设置了过期时间的 Key 中随机淘汰混合使用
volatile-ttl淘汰即将过期的 Key(TTL 最小的)优先保留新数据
allkeys-lfu从所有 Key 中选出最不经常使用的淘汰(4.0+ 版本)访问频率更重要
volatile-lfu从设置了过期时间的 Key 中选出最不经常使用的淘汰(4.0+ 版本)混合使用

4. 实际工作流程示例

RedisKey过期删除策略使用小结

5. 性能优化建议

监控过期 Key 数量
想知道系统中有多少 Key 已被清理?可以这样查询:

redis-cli info stats | grep expired_keys

合理配置 hz 值
hz 值决定了主动扫描的频率。

hz 100   # 更高频率,清理更及时,但 CPU 消耗也更高
hz 1 # 更低频率,CPU 友好,但可能导致过期 Key 堆积

避免大量 Key 同时过期
这是一个非常经典的优化点。如果大批 Key 在同一秒过期,会导致 Redis 在那一瞬间 CPU 飙升。通常的做法是加入随机偏移量:

# 不好的做法:同时设置相同过期时间
for i in range(100000):
redis.set(f"key:{i}", "data", ex=3600)

# 好的做法:添加随机偏移
for i in range(100000):
redis.set(f"key:{i}", "data", ex=3600 + random.randint(0, 300))

6. 特殊情况处理

AOF/RDB 持久化
- RDB:生成快照时,过期的 Key 不会被保存到文件中。
- AOF:当 Key 过期时,Redis 会追加一条 DEL 命令到 AOF 文件里。

主从复制
- 主节点删除过期 Key 后,会主动向从节点发送一条 DEL 命令。
- 从节点没有自主删除过期 Key 的权限,完全听从主节点的指令。

集群模式
- 每个节点独立管理自己的过期 Key。
- 当槽位发生迁移时,Key 的过期信息也会一并迁移到目标节点。

总结

Redis 的过期删除策略,本质上是一套 惰性删除 + 定期删除 的组合拳:

  • 惰性删除:保证每次访问的“正确性”,确保不会返回已过期的数据。
  • 定期删除:作为补充,主动清理那些无人访问的过期 Key,减少内存浪费。
  • 内存淘汰:在极端情况下,作为防止内存耗尽的最后一道防线。

这套机制在 CPU 使用率、内存效率和实现复杂性之间,取得了相当不错的平衡。也正是因此,Redis 才能在高并发场景下流畅地处理海量带有过期时间的 Key。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Redis是什么:核心特性、架构与应用场景解析

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

时间:2026-09-01 06:20
Windows 安装 MongoDB 完整图文教程

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

时间:2026-09-01 06:20
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

时间:2026-09-01 06:20
MacOS安装MongoDB完整教程

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

时间:2026-09-01 06:19
Ubuntu系统安装与配置Redis完整指南

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。

时间:2026-09-01 06:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全