Redis 如何配置 Key 的过期时间?它的实现原理?

Redis 配置 Key 过期时间主要通过 4个核心命令 实现,其底层依赖"过期字典+三种过期删除策略"协同工作,在保证内存不溢出的同时平衡性能损耗。

一、Key 过期时间的配置方式

通过以下命令为 Key 设置或管理过期时间,过期后 Key 会被自动删除(或标记为删除):

  • EXPIRE key seconds:为已存在的 Key 设置过期时间(单位:秒),如 EXPIRE user:100 3600(用户100的缓存1小时后过期)。

  • PEXPIRE key milliseconds:与 EXPIRE 功能一致,单位改为毫秒,支持更精细的过期控制。

  • SET key value EX seconds:创建 Key 时直接附带过期时间(原子操作),如 SET product:200 apple EX 1800(商品200的缓存30分钟后过期),避免"先创建Key再设过期"的中间态问题。

  • PEXPIREAT key timestamp-ms:指定 Key 过期的"毫秒级时间戳"(如 PEXPIREAT order:300 1717248000000),适用于需在固定时间点过期的场景(如凌晨3点清理当日日志Key)。

此外,可通过 TTL key 查看 Key 剩余过期时间(返回秒数,-1表示永不过期,-2表示已过期),PTTL key 则返回毫秒数。

二、过期时间的实现原理

Redis 并非"过期后立即删除Key",而是通过"过期字典记录过期时间+三种删除策略组合"实现高效管理,核心逻辑如下:

1. 过期字典:记录过期时间

Redis 内部维护一个"过期字典"(本质是哈希表),key 是待过期的 Redis Key,value 是该 Key 的过期时间戳(秒或毫秒)。当为 Key 设置过期时间时,会同时在过期字典中添加一条记录;删除 Key 或 Key 过期后,会从过期字典中移除对应记录。

2. 三种过期删除策略:平衡"内存占用"与"性能损耗"

由于"立即删除所有过期Key"会导致CPU占用过高(频繁扫描),"永不主动删除"会导致内存溢出,Redis 采用三种策略结合:

策略1:惰性删除(Lazy Delete)

仅在"访问 Key 时"检查是否过期(如执行 GET key),若过期则立即删除并返回 nil。优点是不消耗额外CPU(只在访问时处理),缺点是可能导致"过期Key长期占用内存"(如长期不访问的过期Key)。

策略2:定期删除(Periodic Delete)

Redis 每隔100毫秒(默认)会随机扫描"过期字典"中的部分 Key(如每次扫描20个),若扫描到过期Key则删除;若单次扫描中过期Key占比超过25%,会重复扫描(最多重复10次),避免大量过期Key堆积。该策略平衡了CPU和内存,是过期删除的核心。

策略3:内存淘汰(Memory Eviction)

当 Redis 内存达到 maxmemory 上限时,会触发"内存淘汰策略"(如 allkeys-lru 淘汰最近最少使用的Key),即使Key未到过期时间,也会被删除以释放内存。该策略是"过期删除"的兜底,确保内存不溢出。

相关推荐
fen_fen8 分钟前
用户信息表建表及批量插入 100 条数据(MySQL/Oracle)
数据库·mysql·oracle
马克Markorg6 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy9 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道10 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075310 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha11 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_11 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance11 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋11 小时前
【Redis】主从复制
数据库·redis