Redis存活时间怎么调啊,设置过期时间那些事儿你知道吗
- 问答
- 2025-12-25 06:13:44
- 1
综合自Redis官方文档、社区常见问题讨论以及《Redis实战》等技术书籍中的相关章节)
Redis存活时间怎么调啊,设置过期时间那些事儿你知道吗?这事儿说白了,就是教你如何给放在Redis里的数据定一个“保质期”,就像牛奶放冰箱久了也会坏一样,Redis里的数据也不能永远存着,不然内存迟早会被塞满,导致服务崩溃,学会设置过期时间,是用好Redis的关键一步。
为什么要设置过期时间?
你得明白为啥要这么干,最主要的原因就是节省内存,Redis的数据都放在内存里,内存可比硬盘贵多了,空间也有限,如果你的应用不停地往Redis里塞数据,又从来不清理,那再大的内存也有用完的一天,一旦内存满了,新的数据就写不进去了,或者会触发Redis的淘汰机制,把一些老数据删掉,这可能会影响到正在运行的服务。

是为了满足业务逻辑的需要,很多数据本来就是有生命周期的。
- 用户登录凭证(Session): 用户登录后,给你一个token,这个token通常有效期为一天或一周,过期就需要重新登录,把token存在Redis里,并设置好对应的过期时间,时间一到Redis自动给你删了,非常省心。
- 手机验证码: 验证码通常5分钟内有效,存进Redis,设置5分钟过期,时间一到,验证码自动失效,安全又方便。
- 热点数据的缓存: 从数据库里查出来的热点文章、商品信息,你可能想在Redis里缓存一个小时,一小时后,缓存自动失效,下次再查询时,重新从数据库加载最新数据,既能提升访问速度,又能保证数据相对新鲜。
设置过期时间,既是“节流”(省内存)的手段,也是“开源”(实现业务)的工具。
怎么给数据设置过期时间?
Redis提供了几个简单的命令来管理过期时间,最常用的就是EXPIRE家族。

EXPIRE key seconds: 这是最基础的命令,给一个已经存在的key设置多少秒后过期,你设置了一个key叫user:1001:token,然后执行EXPIRE user:1001:token 3600,那么这个key就会在3600秒(也就是1小时)后自动被Redis删除。PEXPIRE key milliseconds: 和EXPIRE一样,但时间单位是毫秒,用在需要更精确控制过期时间的场景,PEXPIRE key 1500就是1.5秒后过期。SETEX key seconds value: 这是一个组合命令,“SET”和“EXPIRE”一步到位,你可以在设置key的同时,直接指定它的过期时间。SETEX sms_code:13800138000 300 123456,意思是设置key为sms_code:13800138000,值是123456,并且300秒后过期,这比先SET再EXPIRE要高效,因为只发生了一次网络通信。PSETEX key milliseconds value: 和SETEX一样,单位是毫秒。- 设置永不过期: 如果你不小心给一个key设置了过期时间,后来又想让它永久存在,可以用
PERSIST key命令来移除这个key的过期时间,让它持久保存。
如何查看剩余的存活时间?
设了过期时间,你总得能看看它还剩下多少“阳寿”吧。
TTL key: 这个命令最常用,它返回这个key剩余的存活时间,单位是秒,如果key不存在了,返回-2,如果key存在但没有设置过期时间,返回-1,如果返回一个大于0的数字,比如250,就表示还剩250秒过期。PTTL key: 和TTL一样,但返回的是毫秒数。
需要注意的几个坑和技巧
光知道命令还不够,实际用的时候有些细节得留心。

-
过期时间可能不“精确”: (来源:Redis官方文档关于过期精度的说明)Redis并不是在key过期的那一毫秒就立刻删除它,因为如果每秒有成千上万个key过期,Redis一个个精确删除会非常消耗CPU,Redis采用的是惰性删除和定期删除相结合的策略。
- 惰性删除:当客户端尝试访问一个key时,Redis会先检查它是否已过期,如果过期了就当场删除,然后返回空值,这就像超市检查商品保质期,等你来买的时候才看。
- 定期删除:Redis会每隔一段时间(默认100毫秒)随机抽取一批设置了过期时间的key,检查并删除其中已过期的,这就像超市营业员定期巡查货架,清理过期商品。 因为这两种机制,一个key过期后,可能会延迟一小段时间才被真正删除,在绝大多数业务场景下,这种微小延迟是可以接受的。
-
重新设置值会清除过期时间: 如果你对一个已经设置了过期时间的key重新使用
SET命令赋值,那么之前设置的过期时间会被清除,这个key将变成永久的,除非你再次为它设置过期时间,这一点很容易被忽略,导致内存泄漏,比如你先SETEX mykey 100 value1,然后过了50秒,你又SET mykey value2,那么这个mykey就会永久存在了。 -
过期事件通知: (来源:Redis Keyspace Notifications功能说明)如果你的应用需要知道某个key什么时候过期,可以开启Redis的
keyspace notifications功能,开启后,当key因为过期而被删除时,Redis可以发布一个消息到特定的频道,你的程序可以订阅这个频道来接收通知,这个功能可以用来实现一些高级需求,比如监控、或者实现更复杂的延迟任务。
总结一下
给Redis设置存活时间,核心就是那几个命令:EXPIRE、SETEX、TTL,理解为什么要设置过期时间(省内存、满足业务),比死记命令更重要,要心里有数,Redis的过期删除不是实时的,有一点点延迟,并且要小心重新赋值会覆盖掉原有的过期时间,把这些事儿搞明白了,你就能更好地驾驭Redis的内存,让它更稳定地为你的应用服务。
本文由符海莹于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/68000.html
