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未到过期时间,也会被删除以释放内存。该策略是"过期删除"的兜底,确保内存不溢出。

相关推荐
程序员小假21 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
武子康1 天前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
maozexijr1 天前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn08951 天前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
独断万古他化1 天前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee
毕设源码_郑学姐1 天前
计算机毕业设计springboot基于HTML5的酒店预订管理系统 基于Spring Boot框架的HTML5酒店预订管理平台设计与实现 HTML5与Spring Boot技术驱动的酒店预订管理系统开
spring boot·后端·课程设计
不吃香菜学java1 天前
spring-依赖注入
java·spring boot·后端·spring·ssm
ja哇1 天前
Spring AOP 详细讲解
java·后端·spring
南部余额1 天前
Spring Boot 整合 MinIO:封装常用工具类简化文件上传、启动项目初始化桶
java·spring boot·后端·文件上传·工具类·minio·minioutils
海南java第二人1 天前
Spring Bean生命周期深度剖析:从创建到销毁的完整旅程
java·后端·spring