Redis07-Redis键过期时间设置以及过期键删除策略
前言
上一篇我们介绍了Redis06-Redis的数据库与键空间,这一篇我们介绍一下Redis数据库中如何给键设置过期时间,以及过期键删除策略。
键的过期时间如何设置?
在Redis中我们可以通过四个不同的命令来给键设置过期时间,分别是:
EXPIRE <key> <ttl>
命令用于将键key的生存时间设置成ttl秒。(TTL的意思是 Time To Live)PEXPIRE <key> <ttl>
命令将键key的生存时间设置成ttl毫秒。PEXPIREAT <key> <timestamp>
命令用于将键key的过期时间设置为timestamp锁所指定的秒数时间戳。PEXPIREAT <key> <timestamp>
命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。
虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的。无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行结果都和执行PEXPIREAT命令一样。
过期时间如何保存?
redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典,过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键),键空间的键和过期字典的键都是指向同一个键对象。另外,过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间,该过期时间是一个毫秒精度的UNIX的时间戳。
这里的时间戳 1600341444018 表示到 2020-09-17 19:20:30秒是键message的过期时间。
过期键如何判定呢?
检查一个键是否过期的判定步骤主要有两步:
- 检查给定键是否存在于过期时间,如果存在,那么取键的过期时间。
- 检查当前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函数所描述的方法一致,因为直接访问字典比执行一个命令稍快一些。
如何自动删除带过期时间的键?
通过前面的介绍,我们知道了数据库键的过期时间都是保存在过期字典中,又知道了如何根据过期时间去判断一个键是否过期, 现在需要考虑的一个问题是,如果一个键过期了,那么它什么时候会被删除呢?
这个问题有三种可能的答案,他们分别代表了三种不同的删除策略:
- 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。这种策略可以保证过期键会被尽快地被删除,并释放过期键所占用的内存。但是它对CPU时间是最不友好的,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,无疑会对服务器的响应时间和吞吐量造成影响。
- 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都会检查取得的键是否过期,如果过期的话,就会删除该键,如果没有过期,就返回该键。该策略对CPU时间来说是最友好的,程序只会在取出键时才会对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行。但是它的缺点就是对内存是最不友好的,如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会被释放。
- 定期删除:每隔一段时间(默认是每隔100ms),会扫描一定数量的数据库的expires字典中的一定数量的key。并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
Redis中同时使用了惰性过期和定期过期两种过期策略。
总结
本文主要从Redis键过期时间的设置,过期时间的保存以及过期键的删除策略四个方面对Redis中键过期时间进行了阐述。
文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。
原文链接:feige.blog.csdn.net/article/details/108650439
- 点赞
- 收藏
- 关注作者
评论(0)