Redis对于过期key的三种删除策略及解读

 更新时间:2026年06月15日 09:23:14   作者:JFS_Study  
这篇文章主要介绍了Redis对于过期key的三种删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、简述

Redis 中过期 key 的删除策略,分为三种:

定时删除、定期删除、惰性删除。

其中,定时删除和定期删除是主动删除策略,惰性删除是被动删除策略。

二、定时删除

定时删除是在设置 key 的过期时间的同时,会创建一个定时器(timer)。

定时器在 key 的过期时间来临时,立即执行对 key 的删除操作。

优点:

保证过期 key 会尽可能快的被删除,并释放过期 key 所占用的内存。

缺点:

对 CPU 时间最不友好。在过期 key 比较多的情况下,删除过期 key 这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期 key 上,无疑会对服务器的响应时间和吞吐量造成影响。

创建一个定时器(timer)需要用到 Redis 服务器中的时间事件,而当前时间事件是用无序链表实现的,查找一个事件的时间复杂度为 O(N),并不能高效地处理大量时间事件。要让服务器创建大量的定时器,从而实现定时删除,在现阶段来说并不现实。

三、定期删除

定期删除是每隔一段时间,程序就会对 Redis 数据进行一次检查,删除里面的过期 key,至于要删除多少过期 key,以及要检查多少个 db,则是由 Redis 内部算法决定。

Redis 通过限制删除操作执行的时长和频率来减少对 CPU 时间的影响。限制删除操作执行的时长和频率需要合理地设置,否则可能会演变成定时删除或者惰性删除。

优点:

通过定期删除策略,可以有效地减少因为过期 key 而带来的内存浪费。

四、惰性删除

惰性删除是定时删除和定期删除的折中处理方案。

它放任 key 过期不管,但是每次获取 key 时,都会检查取得的 key 是否过期,如果过期,则删除该 key;若没有过期,就返回该 key 的值。

优点:

对 CPU 时间最友好。只在取出 key 时,才对 key 进行过期检查,即只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的 key,不会在删除其他无关的过期 key 上花费任何 CPU 时间。

缺点:

对内存最不友好。如果一个 key 已经过期,而这个 key 又仍然保留在 db 中,那么只要这个过期 key 不被删除,它所占用的内存就不会释放。如果 db 中有大量的过期 key,而这些过期 key 又恰好没有被访问到的话,那它们也许永远也不会被删除,除非用户手动执行 flushdb 命令清空,这样会导致大量的无用的脏数据占用大量的内存。

Redis 过期 key 在实际中是定期删除策略和惰性删除策略两者配合使用,服务器可以很好地在合理使用 CPU 时间和避免浪费内存空间之间取得平衡。

五、Redis 中 flushall 和 flushdb 的区别

Redis 中,flushall 和 flushdb 都是清空当前数据库的操作,但是两者有很大的区别:

  • flushall 清空数据库并执行持久化操作,也就是 rdb 文件会发生改变,变成 76 个字节大小(初始状态下为 76 字节),所以执行 flushall 之后数据库真正意义上清空了。
  • flushdb 清空数据库,但是不执行持久化操作,也就是说 rdb 文件不发生改变。而 Redis 的数据是从 rdb 快照文件中读取加载到内存的,所以在 flushdb 之后,如果想恢复数据库,则可以直接 kill 掉 redis-server 进程,然后重新启动服务,如此 Redis 重新读取 rdb 文件,数据恢复到 flushdb 操作之前的状态。

注意:

要直接 kill 掉 redis-server 服务,因为 shutdown 操作会触发持久化。

lsof -i:6379命令查看 redis-server 的进程号,然后 kill 即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Web-ssrfme:redis 未授权访问攻击的问题解决

    Web-ssrfme:redis 未授权访问攻击的问题解决

    本文主要介绍了Web-ssrfme:redis 未授权访问攻击的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Redis Brpop 命令作用详解

    Redis Brpop 命令作用详解

    BRPOP 是一个阻塞的列表弹出原语,该命令会按照给出的 key 顺序查看 list,并在找到的第一个非空 list 的尾部弹出一个元素,今天通过本文给大家介绍Redis Brpop 命令相关知识,感兴趣的朋友一起看看吧
    2023-07-07
  • Redis 整数集合的具体使用(intset)

    Redis 整数集合的具体使用(intset)

    对于集合,STL 的 set 相信大家都不陌生,本文主要介绍了整数集合,又称为 intset,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Redis 8种基本数据类型及常用命令和数据类型的应用场景小结

    Redis 8种基本数据类型及常用命令和数据类型的应用场景小结

    Redis是一种基于内存操作的数据库,其中多亏于高效的数据结构,本文主要介绍了Redis 8种基本数据类型及常用命令和数据类型的应用场景小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • redis命令行查看中文不乱码的方法(十六进制字符串处理)

    redis命令行查看中文不乱码的方法(十六进制字符串处理)

    这篇文章主要给大家介绍了关于redis命令行查看中文不乱码的方法,其中详细介绍了十六进制字符串处理的相关资料,文中给出了详细的示例代码,供大家参考学习,下面随着小编来一起学习学习吧。
    2017-10-10
  • 详解Redis高效恢复策略内存快照与AOF

    详解Redis高效恢复策略内存快照与AOF

    这篇文章主要为大家介绍了Redis高效恢复策略内存快照与AOF及对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis持久化使用及说明(RDB&AOF)

    Redis持久化使用及说明(RDB&AOF)

    Redis通过RDB(定期快照)和AOF(日志记录)实现持久化,兼顾内存性能与数据安全,RDB文件紧凑,适合冷备;AOF实时性强,但体积较大,两者结合使用(混合持久化)可平衡效率与可靠性,确保数据在异常重启时恢复
    2025-08-08
  • redis 用scan指令 代替keys指令(详解)

    redis 用scan指令 代替keys指令(详解)

    下面小编就为大家分享一篇redis 用scan指令 代替keys指令详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • redis中zSet实现排行榜的使用示例

    redis中zSet实现排行榜的使用示例

    在工作中,有时候需要实现排行榜功能,本文主要介绍了redis中zSet实现排行榜的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • redis中5种数据基础查询命令

    redis中5种数据基础查询命令

    本文主要介绍了redis中5种数据基础查询命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论