Redis key的过期时间和永久有效分别怎么设置

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis的Key过期机制是内存优化、缓存管控的核心功能,分为临时过期(带失效时间)永久有效(无失效时间)两种模式,下文详解两类场景的标准命令、用法示例、核心校验及关键注意事项。

一、设置Key过期时间(临时失效)

Redis提供多组过期设置命令,支持秒级/毫秒级相对时间/绝对时间戳两种维度,可根据业务场景选择,所有命令执行成功返回1,Key不存在返回0。

1. 最常用:秒级相对过期(EXPIRE)

为已存在的Key设置秒级过期时间,从执行命令时刻开始倒计时,倒计时结束后Key自动删除。

  • 语法:EXPIRE key seconds
  • 参数说明:key为目标键名,seconds为过期秒数(正整数)
  • 实操示例:

2. 毫秒级相对过期(PEXPIRE)

适用于高精度过期场景,单位为毫秒,用法与EXPIRE完全一致,仅时间单位不同。

  • 语法:PEXPIRE key milliseconds
  • 实操示例:
# 设置key=order:2024,3000毫秒(3秒)后过期
127.0.0.1:6379> PEXPIRE order:2024 3000
(integer) 1

3. 秒级绝对时间戳过期(EXPIREAT)

指定Key在未来某个Unix时间戳(秒级)自动过期,适合固定时点失效的场景(如活动截止、验证码过期)。

  • 语法:EXPIREAT key timestamp
  • 实操示例:
# 2026-03-18 23:59:59 过期(对应时间戳:1742313599)
127.0.0.1:6379> EXPIREAT activity:vip 1742313599
(integer) 1

4. 毫秒级绝对时间戳过期(PEXPIREAT)

绝对时间戳的毫秒级版本,精度更高,语法与EXPIREAT一致。

  • 语法:PEXPIREAT key timestamp

5. 一键赋值+过期(SET命令扩展)

创建Key时直接附带过期参数,无需单独执行EXPIRE,简化操作,是日常缓存最推荐的写法。

  • 秒级过期语法:SET key value EX seconds
  • 毫秒级过期语法:SET key value PX milliseconds
  • 实操示例:
# 赋值+60秒过期,一步完成
127.0.0.1:6379> SET cache:goods:10086 "goods_info" EX 60
OK

二、设置Key永久有效(取消过期)

对于已设置过期时间的Key,若需要转为永久存储、永不删除,使用PERSIST命令即可清除过期标记,执行成功返回1,Key无过期时间返回0。

核心命令:PERSIST

  • 语法:PERSIST key
  • 原理:移除Key的过期属性,将临时Key转为永久有效Key
  • 实操示例:
# 先设置临时过期
127.0.0.1:6379> SET config:system "base_config" EX 3600
OK
# 转为永久有效
127.0.0.1:6379> PERSIST config:system
(integer) 1
# 校验过期时间(返回-1表示永久有效)
127.0.0.1:6379> TTL config:system
(integer) -1

三、关键校验命令(必看)

通过以下命令可快速查看Key的过期状态,避免设置失效:

  • TTL key:查看Key剩余过期秒数(-1=永久有效,-2=Key不存在)
  • PTTL key:查看Key剩余过期毫秒数(精度更高)

四、未设置过期时间的Key,会被清除吗?

很多人会误以为“不设过期时间=永远不会丢”,实则Redis对未设置过期(永久有效)的Key,不会主动按时间清除,但存在3种特殊清除场景,需重点区分:

  • 默认场景:不会自动清除未配置过期时间的Key,属于持久化存储类Key,Redis不会通过过期机制主动删除,只要服务器正常运行、不触发其他清理规则,Key会一直留存。
  • 内存淘汰触发:强制清理当Redis内存占用达到配置的maxmemory上限时,会根据内存淘汰策略清理Key。即使Key未设过期,只要符合淘汰规则(如allkeys-lru、allkeys-random),也会被优先清除释放内存,这是生产环境最常见的“无过期Key被删”原因。
  • 手动/被动清除执行DEL、FLUSHDB、FLUSHALL等手动命令,或覆盖Key(重复SET、GETSET)、重启服务器丢失未持久化数据,也会导致无过期Key被清除,这类属于人为操作或部署配置导致,并非Redis自动过期行为。

核心结论:无过期时间 ≠ 绝对安全。业务核心数据建议搭配Redis持久化(RDB+AOF),合理配置内存淘汰策略,避免关键数据被误删。

五、避坑注意事项

1. 重复执行SET/GETSET等赋值命令,会覆盖原有过期时间,Key自动转为永久有效,需重新设置过期。2. 对不存在的Key执行过期命令,会返回0且无任何效果。3. 过期时间仅作用于Key本身,对Hash、List等复杂数据结构的子字段无效。4. 多次执行过期命令,最后一次执行的时间会覆盖之前的过期时长。5. 永久有效Key仅规避了时间过期,仍受内存淘汰、手动操作、持久化策略影响。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis基础 文章被收录于专栏

本专栏带你从零掌握 Redis 核心知识,清晰讲解过期策略、内存淘汰等面试重点。用通俗语言拆解底层原理,搭配实战案例与常见问题总结,兼顾入门理解与面试备考,帮你快速建立完整 Redis 知识体系,轻松应对开发与面试

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务