Redis07-Redis键过期时间设置以及过期键删除策略

举报
码农飞哥 发表于 2021/05/29 12:48:16 2021/05/29
【摘要】 前言 上一篇我们介绍了Redis06-Redis的数据库与键空间,这一篇我们介绍一下Redis数据库中如何给键设置过期时间,以及过期键删除策略。 键的过期时间如何设置? 在Redis中我们可以通过四个不同的命令来给键设置过期时间,分别是: EXPIRE <key> <ttl> 命令用于将键key的生存时间设置成ttl秒。(TTL的意思是 ...

前言

上一篇我们介绍了Redis06-Redis的数据库与键空间,这一篇我们介绍一下Redis数据库中如何给键设置过期时间,以及过期键删除策略。

键的过期时间如何设置?

在Redis中我们可以通过四个不同的命令来给键设置过期时间,分别是:

  1. EXPIRE <key> <ttl> 命令用于将键key的生存时间设置成ttl秒。(TTL的意思是 Time To Live)
  2. PEXPIRE <key> <ttl> 命令将键key的生存时间设置成ttl毫秒。
  3. PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp锁所指定的秒数时间戳。
  4. PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。
    虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的。无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行结果都和执行PEXPIREAT命令一样。

过期时间如何保存?

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典,过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键),键空间的键和过期字典的键都是指向同一个键对象。另外,过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间,该过期时间是一个毫秒精度的UNIX的时间戳。
在这里插入图片描述
这里的时间戳 1600341444018 表示到 2020-09-17 19:20:30秒是键message的过期时间。

过期键如何判定呢?

检查一个键是否过期的判定步骤主要有两步:

  1. 检查给定键是否存在于过期时间,如果存在,那么取键的过期时间。
  2. 检查当前UNIX时间戳是否大于键的过期时间,如果是的话,那么键已经过期,否则键未过期。
    用伪代码描述如下:
   def is_expired(key): #取得键的过期时间
		expire_time_in_ms=redisDb.expries.get(key)
		#键没有设置过期时间
		if expire_time_in_ms is None: return false
		#取得当前时间的UNIX时间戳
		now_ms=get_current_unix_timestamp_in_ms()
		#检查当前时间是否大于键的过期时间
		if now_ms>expire_time_in_ms: #是,键已经过期 return true
		else: #否,键未过期 return false

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

实现过期键判定的另一种方法是使用TTL命令或者PTTL命令,比如说,如果对某个键执行TTL命令,并且命令返回的值大于等于0,那么说明该键未过期,在实际中,Redis检查键是否过期的方法和is_expireed函数所描述的方法一致,因为直接访问字典比执行一个命令稍快一些。

如何自动删除带过期时间的键?

通过前面的介绍,我们知道了数据库键的过期时间都是保存在过期字典中,又知道了如何根据过期时间去判断一个键是否过期, 现在需要考虑的一个问题是,如果一个键过期了,那么它什么时候会被删除呢?
这个问题有三种可能的答案,他们分别代表了三种不同的删除策略:

  1. 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。这种策略可以保证过期键会被尽快地被删除,并释放过期键所占用的内存。但是它对CPU时间是最不友好的,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,无疑会对服务器的响应时间和吞吐量造成影响。
  2. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都会检查取得的键是否过期,如果过期的话,就会删除该键,如果没有过期,就返回该键。该策略对CPU时间来说是最友好的,程序只会在取出键时才会对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行。但是它的缺点就是对内存是最不友好的,如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会被释放。
  3. 定期删除:每隔一段时间(默认是每隔100ms),会扫描一定数量的数据库的expires字典中的一定数量的key。并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
    Redis中同时使用了惰性过期和定期过期两种过期策略。

总结

本文主要从Redis键过期时间的设置,过期时间的保存以及过期键的删除策略四个方面对Redis中键过期时间进行了阐述。

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/108650439

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200