Redis里怎么给数据定个过期时间,别让它永远占着空间
- 问答
- 2025-12-31 07:35:05
- 1
在Redis这个速度快、内存大的“大仓库”里,数据如果只进不出,再大的空间也迟早会被塞满,就像家里的储物间,不清理旧东西,新东西就放不进去了,给数据“上闹钟”,让它到点自动消失,是使用Redis时必须掌握的核心技巧,这不仅能节省宝贵的内存空间,也是实现很多常见业务逻辑的基础,比如验证码十分钟有效、用户登录状态保持七天、热点数据缓存一小时等等。
具体怎么给Redis里的数据定这个“闹钟”呢?主要有两种直接又简单的方法,都是在存入数据的时候或者之后,通过一条命令来搞定。

第一种方法,也是最常用的,叫做“EXPIRE”命令族。 这个方法的核心思想是,你先正常地把一个键值对存进Redis,然后额外给它附加上一个“生存时间”,根据时间单位的不同,有几个具体的命令可以选择:
- EXPIRE key seconds:这是最基础的命令,你告诉Redis,给这个叫“key”的数据设置一个过期时间,单位是秒,你存了一个验证码
SET verification_code 123456,然后立刻执行EXPIRE verification_code 600,这就意味着这个验证码在600秒,也就是10分钟之后,会被Redis自动删除。(来源:Redis官方文档对EXPIRE命令的描述) - PEXPIRE key milliseconds:这个命令和EXPIRE几乎一样,唯一的区别是时间单位更精确,是毫秒,如果你需要非常精准的时间控制,比如只缓存950毫秒,那就用这个命令。
PEXPIRE hot_data 950。 - EXPIREAT key timestamp:这个命令不是设置一个“时间段”,而是直接指定一个“过期时间点”,这个时间点是一个Unix时间戳,也就是从1970年1月1日到现在经过的秒数,你希望数据在2023年10月27日中午12点整过期,你可以先算出那个时刻的时间戳,然后执行
EXPIREAT my_key 1698384000。(来源:Redis官方文档对EXPIREAT命令的描述) - PEXPIREAT key milliseconds-timestamp:同理,这是EXPIREAT的毫秒版本,使用毫秒级精度的时间戳。
这几个命令用起来非常灵活,你可以随时对一个已经存在的键(只要它还没被删除)设置或修改过期时间,如果设置成功,命令会返回1;如果键不存在,则会返回0。

第二种方法,是在存入数据的同时,一步到位地设置好过期时间。 这种方法更简洁,只需要一条命令,避免了先存后设的两步操作,Redis为最常用的SET命令提供了额外的参数来实现这个功能:
- SET key value EX seconds:你在设置键值对的同时,直接用EX参数指定过期的秒数。
SET session:user123 "user_data" EX 604800这条命令,不仅把用户数据存了起来,还直接规定了它在604800秒(7天)后过期。(来源:Redis官方文档对SET命令选项的描述) - SET key value PX milliseconds:和上面一样,只是单位是毫秒。
- SET key value EXAT timestamp:在设置值的同时,指定一个秒级时间戳作为过期点。
- SET key value PXAT milliseconds-timestamp:在设置值的同时,指定一个毫秒级时间戳作为过期点。
除了SET命令,在其他一些创建数据的命令中,也有类似的选项,比如在列表(List)、集合(Set)等数据结构中添加元素时,有时也可以附带过期时间,但这不如SET命令的选项那么通用。

设置好过期时间后,我们肯定想知道这个数据还能活多久,或者它到底有没有被设置过期时间,Redis也提供了查询命令:
- TTL key:这个命令用来查看一个键还有多少秒过期,如果返回的是正数,比如86,就意味着还剩86秒;如果返回-2,表示这个键已经不存在了(可能已经过期被删,或者被你手动删了);如果返回-1,则是个很重要的信号,意味着这个键没有设置过期时间,它会永远待在内存里,除非你主动删除它。(来源:Redis官方文档对TTL命令的描述)
- PTTL key:作用和TTL一样,只是返回的是毫秒数。
有时候你可能想取消一个键的过期时间,让它从“临时工”变成“永久居民”,可以使用 PERSIST key 命令,如果执行成功,这个键的过期时间会被移除,之后再使用TTL查询,就会返回-1。
了解了如何设置,我们还得知道Redis是怎么在背后默默地清理这些过期数据的,它主要用了两种策略,这两种策略结合使用,既保证了效率,又避免了内存的无谓占用:
- 惰性删除:这是被动策略,当客户端尝试访问一个键时,Redis会先检查一下这个键是否已经过期了,如果过期了,就立刻删除它,然后返回一个空值,好像这个键从来不存在一样,这个策略的好处是删除操作只发生在必要的时候,不会浪费CPU时间去扫描那些没人访问的过期键,但坏处是,如果很多键已经过期了但一直没人访问,它们就会成为“僵尸数据”,继续占用着内存空间。(来源:Redis官方文档对过期机制的描述)
- 定期删除:这是主动策略,为了弥补惰性删除的不足,Redis会每隔一段时间(默认是100毫秒)随机抽取一小部分设置了过期时间的键,检查它们是否过期,如果过期了就删除,通过限制每次检查的数量和时长,这个策略对CPU时间的影响很小,通过多次循环抽样,最终能清理掉大部分过期键,这种策略相当于一个定时的“巡检员”,专门清理那些不被访问的过期数据。
在实际使用中,你设置了一个键10秒后过期,它并不一定会在第10秒整被瞬间删除,可能到了第10秒,它还在那里,直到第11秒有客户端来读取它(触发惰性删除),或者在第10.5秒被定期删除的巡检员发现,才会被清理掉,这种微小的延迟在绝大多数业务场景下都是可以接受的。
给Redis数据设置过期时间是一个简单而强大的功能,通过EXPIRE命令族或在SET时加上EX/PX参数,你可以轻松管理数据的生命周期,再结合TTL命令进行查询监控,你就能很好地控制Redis的内存使用,让它高效地为你的应用服务,避免数据“长生不老”带来的麻烦,对于缓存这类临时数据,养成随手设置过期时间的习惯,是良好Redis实践的重要一环。
本文由盈壮于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/71755.html
