Redis键的生存时间和过期时间

一、设置键的过期时间

Redis可以通过EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT对键设置有效期,使用TTL或者PTTL查看键的有效期,-1表示键是永久的,PERSIST可以移除一个键的过期时间。

二、过期键的判定

REDIS使用一个过期字典来保存键的过期时间,通过过期字典,程序可以用以下步骤判断键是否过期:
(1)检查给定键是否存在过期字典:如果存在,那么取得键的过期时间
(2)检查当前UNIX时间戳是否大于键的过期时间:如果是,则过期

三、过期键删除策略

存在三种删除策略:
(1)定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:通过使用定时器,可以保证过期键会尽可能快的被删除,被释放过期键所占用的内存。
缺点:①对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键这一行为会占用很多的CPU时间,在内存不紧张但是CPU紧张的情况下,这种策略反而会对服务器的响应时间和吞吐量造成影响。②创建一个定时器需要用到Redis服务器中的时间事件 ——redis中是使用无序链表实现的,查找一个事件的时间复杂度为O(N),并不能高效的处理大量时间事件。
(2)惰性删除
放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键。
优点:对CPU友好
缺点:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,所占用的内存就不会释放。过期且长期不使用的键可以看成一种内存泄漏。
(3)定期删除
每隔一段时间进行一次检查,删除里面的过期键。定期删除是前两种方案的一种折中。
难点:确定删除操作执行的时长和频率。
Redis中使用的删除策略是惰性删除和定期删除

四、RDB、AOF和复制功能对过期键的处理

RDB

1.生成RDB文件:执行SAVE或者BGSAVE命令时,已过期的键不会被写入RDB文件。
2.载入RDB文件:
(1) 如果服务器以主服务器模型运行, 程序会对文件中保存的键进行检查,过期的键不会被载入到数据库中。
(2)如果服务器以从服务器模式运行,不论文件中保存的键是否过期,都会被载入到数据库中。不过因为主从服务器在进行同步的时候,从服务器的数据库会被清空,所以过期键对RDB载入的服务器也不会造成影响。

AOF

1.AOF文件写入:当服务器以AOF持久化模式运行时,如果某个键已经过期,但是还没有被惰性删除或者定时删除时,不会对AOF文件产生任何影响。当过期键被惰性删除或者定时删除后,想AOF文件中追加(append)一条DEL命令。
2.AOF文件重写:在执行AOF文件的过程中,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。

复制

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制:
主服务器在删除一个过期键之后会想从服务器发送一个DEL命令
从服务器在执行读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样处理过期键
从服务器只有接收到主服务器的DEL命令时才会删除过期键。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 因前两天服务器挂掉了,导致项目使用的redis数据库异常,丢失了部分数据,为了能够更好的使用Redis,结合网上的...
    呦_小宋啊阅读 6,815评论 2 9
  • 从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明...
    不变甄心阅读 3,950评论 0 4
  • 前言 在上一篇文章中,介绍了Redis内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复...
    Java架构阅读 7,048评论 3 21
  • 2018-7-10 好的诗文总喜欢收藏 笔墨度之电脑 今置手机一角 每每读来 陶醉于心灵远眺 读过也许会忘掉 入心...
    山脚石阅读 2,241评论 0 0
  • 看到这一排攀过围墙,以成熟的风韵惹人遐思的繁花,你就瞬间明白,四娘家的花开到“千朵万朵压枝低”,让大诗人流连忘返,...
    夕瑶_4067阅读 3,122评论 2 5

友情链接更多精彩内容