Redis里怎么给Key定个有效期,避免数据一直占着不释放
- 问答
- 2025-12-30 03:13:20
- 1
在Redis里,给Key设置有效期是一个非常核心且常用的功能,它的主要目的就是像给你的数据设定一个“保质期”一样,时间一到,Redis就会自动把这个Key和它对应的数据从内存中删除掉,这样做的好处显而易见:可以有效地清理掉那些不再需要的数据,比如用户的临时登录凭证、短信验证码、或者一些缓存的计算结果,从而节省宝贵的内存空间,避免无用数据一直占着地方不释放。
Redis提供了几种简单直接的方式来给Key设定这个“保质期”。
第一种最常用的方法是使用 EXPIRE 命令。 (来源:Redis命令文档)这个命令的用法很直观,假设你已经设置了一个Key,叫做 user:1000:session,存储了用户1000的会话信息,你现在希望这个会话在30分钟后自动失效,那么你只需要执行一条命令:EXPIRE user:1000:session 1800,这里的1800就是时间,单位是秒,执行成功后,Redis会返回整数1表示设置成功,从这一刻开始,1800秒的倒计时就启动了,你可以随时使用 TTL 命令(Time To Live的缩写)来查看这个Key还剩下多少秒的存活时间,例如输入 TTL user:1000:session,Redis就会返回剩余的时间秒数,如果返回-2,则表示这个Key已经不存在了(已过期被删除);如果返回-1,则表示这个Key存在但没有设置过期时间。
第二种方法是使用 PEXPIRE 命令。 (来源:Redis命令文档)这个命令和 EXPIRE 的作用完全一样,唯一的区别在于它的时间单位是毫秒而不是秒,如果你需要更精确的时间控制,比如设定一个2350毫秒后过期的Key,就可以使用 PEXPIRE key 2350,相应地,也有一个 PTTL 命令用来以毫秒为单位查看剩余生存时间。
第三种方法是在创建Key的同时就直接给它设定过期时间。 (来源:Redis命令文档)这通常比先设置Key再使用 EXPIRE 命令更高效,因为它只需要一次网络通信,Redis为这种场景提供了两个命令:SETEX 和 PSETEX,你要设置一个Key为 captcha:13800138000(某个手机号的验证码),值为“123456”,并且让它60秒后过期,那么你可以直接使用 SETEX captcha:13800138000 60 123456,这个命令等价于先执行 SET captcha:13800138000 123456,再立刻执行 EXPIRE captcha:13800138000 60,但效率更高。PSETEX 则是毫秒版本的 SETEX。
除了上面这些基于“相对时间”(从设置的那一刻开始计算倒计时)的命令,Redis还支持基于“绝对时间”的设定方式。
第四种方法是使用 EXPIREAT 命令。 (来源:Redis命令文档)这个命令允许你指定一个Key过期的具体时间点,这个时间点是一个Unix时间戳(从1970年1月1日开始的秒数),你希望某个促销活动的Key在2023年12月31日晚上23点59分59秒准时失效,你可以先计算出这个时间点的时间戳(例如1704038399),然后执行 EXPIREAT promotion:key 1704038399,同样地,也有一个毫秒精度的版本叫 PEXPIREAT。
过期的Key是如何被Redis清理掉的呢? (来源:Redis持久化与内存管理文档)这是一个很重要的问题,Redis并不是在Key过期的那一毫秒就立刻去删除它,因为如果同时有大量Key过期,立即删除可能会阻塞服务器,影响其他命令的执行,Redis主要使用两种策略来结合处理过期Key的删除:
-
惰性删除:当客户端尝试访问一个Key时,Redis会先检查这个Key是否已经过期,如果过期了,那么Redis会立刻删除它,然后返回一个空值,就像这个Key从来不存在一样,这种策略的好处是删除操作只发生在必要的时候,不会消耗额外的CPU资源,但坏处是,如果一个过期的Key永远不再被访问,那么它就会一直占用着内存,直到被其他方式清除。
-
定期删除:为了弥补惰性删除的不足,Redis会定期地(默认是每100毫秒一次)主动随机测试一小部分设置了过期时间的Key,它会检查这些Key是否已经过期,如果过期就将其删除,通过调整每次检查的Key的数量和频率,Redis可以在内存浪费和CPU消耗之间取得一个平衡。
需要注意的是,如果你在一个Key已经存在的情况下,重新使用 SET 命令为其赋值,那么之前为该Key设置的所有过期时间都会被清除,这个Key将变成一个永不过期的Key,除非你再次为其设置新的过期时间,使用 PERSIST 命令可以手动移除一个Key的过期时间,使其永久化。
给Redis的Key设置有效期是管理内存、自动化清理临时数据的关键手段,你可以根据实际需求,选择在创建Key时(SETEX/PSETEX)或创建后(EXPIRE/PEXPIRE),使用相对时间或绝对时间(EXPIREAT/PEXPIREAT)来灵活地控制每个Key的生命周期,理解惰性删除和定期删除这两种清理机制,也有助于你更好地规划和诊断与数据过期相关的应用行为。

本文由雪和泽于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/71024.html
