一、基本命令

Redis中我们可以通过EXPIRE和PEXPIRE来设置键的生存时间(TTL),通过命令,客户端可以经过指定的秒或者毫秒为精度,对数据库中的特定键设置生存时间;

同样,我们可以通过EXPIREAT命令或者PEXPIREAT命令,以秒或者毫秒精度给数据的某个键设置过期时间(expire time),其中过期时间是一个UNIX时间戳,当某个键达到国企时间时,服务器会自动从数据库中删除该键;

同时redis为我们提供了TTL和PTTL命令,用于返回某个键剩余的生存时间,也就是返回距离这个键被服务器自动删除还有多长时间;

虽然设置过期时间和生存时间存在多种不同单位和不同形式的命令,但实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的,无论客户端执行的是四个命令中的哪一个,最后执行效果都和执行PEXPIREAT命令一样。
redis中对过期键的判定主要是一下两个步骤:
1、检查给定键是否存在于过期字典表,如果存在,获取该键的过期时间,如果不存在则代表该键永不过期;
2、检查当前UNIX时间错是否大于键的过期时间,如果是,则代表该键已经过期,否则,键未过期。

最后,redis还提供了PERSIST命令移除一个键的过期时间,即将该键的过期时间设置为永久;

二、过期时间保存

在redis中,redisDb是通过expires字典(过期字典)保存数据库中所有键的过期时间;
其中:
1、过期字典中的键是一个指针,指向键空间中的某个键对象,即代表该键对象的过期时间;
2、过期字段中的值是一个long类型的整数,代表过期时间,精确到毫秒的UNIX时间戳。
这也验证了前面说的,无论执行四个命令中的哪一个,最后存到过期字典里的都是一个long类型的UNIX时间戳。

三、过期键删除策略

从上面的就介绍中,我们不禁会产生疑问:如果一个键过期了,那么他什么时候会被删除呢。
在redis中,存在三种不同的删除策略,分别是定时删除、惰性删除和定期删除。

3.1 定时删除

定时删除,顾名思义,在为特定键设置过期时间的同时,为其创建一个定时器,让定时器在键的过期时间来临时,立刻执行对键的删除操作,并释放过期键所占的内存,所以该方式对内存是友好的。
但是,过多的定时器对CPU会占用相当一部分大的CPU时间,将会对服务器的响应时间和吞吐量造成影响;同时创建一个定时器需要用到Redis服务器中的时间事件3,该时间事件的实现方式为无序链表,查找一个事件的时间复杂度为O(N),并不能高效的处理大量时间事件,因此让服务器创建大量的定时器,来实现定时删除策略,只是一个理论上的策略。

3.2 惰性删除

惰性删除,是指当我们在使用特定键的时候,从过期字典中取出该键的过期时间,再进行过期判断,这样就不会占用过多的CPU资源,但是该策略会导致数据库中存在很多不常用但是已经过期的键吗,这对内存来说是不友好的,会导致内存泄露;

内存泄露:内存中存在大量无用,但是不能被垃圾回收其回收的对象;
内存移除:用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存

3.3 定期删除

从3.1和3.2两种策略的实现发现,这两种策略在单一使用时,都存在明显的问题,将两种方式进行整合或这种,就产生了定期删除策略;
1、定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响;
2、同时通过定期删除过期键,有效的减少了过期键导致的内存浪费问题;
但,定期删除策略的难点是确定删除操作执行的时长和频率;
1、如果操作太频繁,或执行时间过长,就会退化为定时删除;
2、如果操作执行太少,或者执行时间过短,就无法解决惰性删除存在内存浪费的问题。

四、AOF、RDB对过期键的处理

关于AOF和RDB详细介绍请参看我的相关博客。
Redis持久化之RDB文件
Redis持久化之AOF文件

4.1 RDB相关

1、RDB生成:在redis通过SAVE或者BGSAVE创建一个新的RDB文件时,会忽略过期键;
2、载入RDB文件时,如果是主服务器模式,则会忽略过期键,如果是从服务器,则会保存所有键,在主从数据同步时,从服务器的数据会被清空。

4.2 AOF相关

1、当服务器以AOF持久化模式运行时,如果某个键过期,程序会向AOF文件的末尾追加一条DEL命令,来显式的记录该键已经被删除
2、在AOF重新的过程中,程序会对数据库中的键过期时间进行检查,已过期的键不会被保存到AOF文件中

4.3 复制

当服务器运行在复制模式下,从服务器的过期键删除有主服务器控制:
1、主服务器删除一个过期键后,会显式的向所有从服务器发送一个DEL命令,通知从服务器删除这个过期键;
2、从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除;
3、从服务器接到主服务器的DEL命令后,才会删除过期键。

Redis过期时间及过期策略相关推荐

  1. Redis-设置过期时间及淘汰策略

    文章目录 1. TTL 2. 设置过期时间 3. 删除过期key 4. 淘汰策略 Redis-设置过期时间及淘汰策略 项目组使用的 Redis 服务器发出了内存不足报警,查了一些资料,记录下. 1. ...

  2. c# redis 如何设置过期时间_Redis 过期时间与内存管理

    http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...

  3. redis map 过期时间_redis的过期时间和过期删除机制

    一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <K ...

  4. redis map 过期时间_redis 过期时间

    设置key的过期时间,超过时间后,将会自动删除该key.在Redis的术语中一个key的相关超时是不确定的. 超时后只有对key执行DEL命令或者SET命令或者GETSET时才会清除. 这意味着,从概 ...

  5. redistemplate hash 过期时间_Redis过期监听——订单超时-取消

    最近在做电商项目,涉及支付超时处理的几种方式.[记录哈使用redis监听处理] 提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消. 欢迎交流 redis过期监听的实现: 1.修改redi ...

  6. redis 存储数据不设置过期时间 会自动过期吗_Redis-数据淘汰策略持久化方式(RDB/AOF)Redis与Memcached区别...

    Redis与Memcached区别: 两者都是非关系型数据库.主要有以下不同: 数据类型: Memcached仅支持字符串类型. redis支持:String,List,set,zset,hash 可 ...

  7. Redis——过期时间/过期回收策略

    既然是缓存,就会涉及过期时间以及过期后清理回收内存的过程:本篇主要讲一下redis的key过期时间相关的命令.注意事项.回收策略: 注意:实际上,redis的内存回收触发有两种情况,上面说的是一种,也 ...

  8. Redis源码分析:过期key删除与设置key的过期时间

    Redis中设置key过期时间与过期key的处理流程 在Redis中,可以再设置值的时候就设置该Key的过期时间,也可以通过在expire命令来设置某个key值的过期时间,并且在了解完设置过期时间之后 ...

  9. java如何保证redis设置过期时间的原子性_2020年4月Redis面试题和答案整理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 关注.转发.评论头条号每天分享java 知识,私信回复"源码" 赠送Spring源码分析.Dubbo.Redis.Netty. ...

最新文章

  1. Java 基础【04】Swing 组件事件注册
  2. 小程序订单点击不同页面_小程序跳转页面参数丢失
  3. 在计算机术语中 将ALU控制器和,计算机组成原理试题与答案
  4. SpringMVC 理论与实用技术(一) 简单、实用、易懂的几个实例
  5. 流量洪峰成为常态,腾讯数据库如何高性能支撑海量SQL查询?
  6. 构建测试的体系化思维(基础篇)
  7. uboot主Makefile之9——2589行 x210_sd_config目标
  8. 都是套路!HR谈及薪资时的12种套路
  9. 7-34 通讯录的录入与显示 (10 分)
  10. Android Webview SSL 自签名安全校验解决方案
  11. csv文件行数超过软件上限解决方案
  12. Juniper防火墙常用命令
  13. 网站建设之需要改进的地方
  14. 无限乱斗哪个服务器有,《LOL》国服无限乱斗什么时候出 国服2020无限乱斗上线时间...
  15. Altium Designer快捷键
  16. 网站编辑企业如何应用智能员工节省了工资支出
  17. Viper快速配置与上手
  18. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_无网也能传文件?!Win10 自带的“就近共享”功能这么腻害你知道吗?...
  19. python随机抽样_掌握python中的随机抽样
  20. python统计文本字数

热门文章

  1. js中的数组拷贝(浅拷贝,深拷贝)
  2. PHP设置时区方法总结
  3. 美国加州大学数据安全保护措施TOP10借鉴与启发
  4. python代码画乌龟_乌龟教你Python编程——“玫瑰花”是怎么画的!
  5. Joint Pose and Expression Modeling for Facial Expression Recognition 论文翻译
  6. 【OpenCV入门教程】图像加噪
  7. word中如何编辑不同页眉的问题
  8. 两例司法实践撕开了一个口子,区块链应用落地会加速吗?
  9. 服务器(CentOS7)配置R以及R Studio Server
  10. 2.东软跨境电商数仓项目技术选型