Redis过期数据怎么清理掉,过期时间设置和清空问题一起说下
- 问答
- 2026-01-07 06:06:44
- 12
关于Redis过期数据的清理、设置和清空,我们把它分成几个部分来说清楚,这部分内容主要参考了Redis官方文档中对键过期(Key Expiration)机制的描述,并结合了常见的运维实践。
Redis数据为什么会过期?怎么设置过期时间?
Redis本身是一个内存数据库,内存资源非常宝贵,不可能让所有数据都永久保存,Redis设计了一个“过期”机制,给数据设定一个“寿命”,到期后自动被清理掉,从而释放内存空间,这就像给食品贴上保质期标签一样。
设置过期时间的方法非常简单,主要有以下几种命令:

EXPIRE key seconds:这是最常用的命令,给一个已经存在的key设置过期时间,单位是秒,你有一个key叫“user:1000:session”,你想让它在30分钟后失效,就可以执行EXPIRE user:1000:session 1800。SETEX key seconds value:这是一个组合命令,在设置key的值的同时,直接给它指定过期时间,这比先SET再EXPIRE更高效,因为只需要一次网络通信。SETEX mykey 60 "hello"表示设置mykey的值为hello,并在60秒后过期。PEXPIRE key milliseconds:和EXPIRE类似,但时间单位是毫秒,用于需要更精确控制过期时间的场景。- 设置永不过期:如果你在设置key时没有使用
EXPIRE或SETEX等命令,那么这个key默认就是永不过期的,除非你手动删除它或者因为内存满了被Redis的淘汰策略移除(这是另一个话题)。
你可以随时用 TTL key 命令查看一个key还剩多少秒过期,用 PTTL key 查看还剩多少毫秒,如果返回-2,表示key不存在;返回-1,表示key存在但没有设置过期时间。
过期的数据是怎么被自动清理掉的?
这是核心问题,很多人以为key一到过期时间就会立刻被删除,其实不是这样的,Redis采用的是“惰性删除”和“定期删除”相结合的混合策略,这个设计是为了在CPU时间和内存空间之间取得平衡,避免删除操作过多地影响主线程的性能。
-
惰性删除 (Lazy Expiration):

- 怎么做的:当客户端尝试访问一个key时,Redis会先检查这个key是否设置了过期时间,以及是否已经过期。
- 如果过期了:那么Redis会立刻把这个key删除,然后返回一个空值(nil),就像这个key从来不存在一样。
- 优点:删除操作只发生在访问这个key的时候,非常节省CPU资源,因为对于很多过期key,可能永远都不会再被访问到,那就没必要花力气去删它们。
- 缺点:如果有很多key永远不再被访问,那么即使它们已经过期,也会一直占用着内存空间,相当于“内存泄漏”,光靠惰性删除是不够的。
-
定期删除 (Periodic Expiration):
- 怎么做的:为了解决惰性删除的缺点,Redis会每隔一段时间(默认是每秒10次,即100毫秒一次)主动随机抽取一小部分设置了过期时间的key进行检查。
- 检查过程:Redis会从对应的过期key集合中随机抽取20个key(这个数量可配置),检查它们是否过期,删除其中所有已过期的key。
- 如果发现过期key比例很高:如果在这20个key中,发现有超过25%的key已经过期,Redis就会认为这个数据库里过期key很多,于是它会立即再随机抽取20个key,重复这个过程,直到过期key的比例降到25%以下为止。
- 优点:通过这种间歇性的主动扫描,可以清理掉那些长期不被访问的“僵尸”过期key,释放内存。
- 缺点:这是一个权衡,如果扫描得太频繁(比如把每次检查的key数量调得很大),会消耗更多CPU;如果扫描得太少,又可能导致内存回收不及时。
简单总结一下清理过程:你访问key的时候,它会被顺手清理掉;Redis后台也会定时抽检一批key来清理。 这两种方法配合,保证了大多数情况下内存能够被比较及时地回收。
如何手动清空所有数据或特定数据?
除了等待自动过期,我们经常需要手动清理数据,比如做测试或者维护的时候。

-
清空当前数据库的所有数据:
- 使用
FLUSHDB命令,这个命令会立即删除你当前连接的Redis数据库里的所有key,不管它有没有设置过期时间,这个操作非常危险,在生产环境中要极其谨慎。
- 使用
-
清空所有数据库的所有数据:
- Redis可以配置多个数据库(默认16个,编号0-15),如果你想把Redis实例中所有数据库的数据都清空,使用
FLUSHALL命令,这个命令的破坏性比FLUSHDB更大,会清除整个Redis服务器的数据。
- Redis可以配置多个数据库(默认16个,编号0-15),如果你想把Redis实例中所有数据库的数据都清空,使用
-
删除单个或多个指定的key:
- 使用
DEL key [key ...]命令,你可以同时删除一个或多个key,DEL key1 key2 key3。
- 使用
-
异步清空(Redis 4.0及以上版本):
- 对于
FLUSHDB和FLUSHALL,在Redis 4.0版本之后,提供了异步选项,即FLUSHDB ASYNC和FLUSHALL ASYNC。 - 为什么要用异步?因为如果数据库非常大,清空操作可能会阻塞Redis服务器一段时间,导致其他命令无法响应,使用异步方式,Redis会先在后台线程中慢慢释放内存,主线程可以继续处理命令,避免了阻塞,在可能的情况下,推荐使用异步方式。
- 对于
重要提醒:FLUSHDB和FLUSHALL是极其危险的命令,尤其是在生产环境,执行前必须确认当前连接的是否为目标数据库,并且要有权限管理和操作审计,避免误操作导致数据丢失。
能直接解答你对Redis数据过期和清理的疑问。
本文由黎家于2026-01-07发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/76029.html
