1.设置过期时间
redis可以通过4种指令设置键的生存时间
- expire key seconds 设置多少秒过期
- pexpire key milliseconds 设置多少毫秒过期
- expireat key timestamp 设置过期的秒时间戳
- pexpireat key timestamp 设置过期的毫秒时间戳
无论单位如何,最后都是转换成pexpireat命令来实现过期
2.记录
expires过期字典保存了所有键的过期时间
- 过期字典的键是一个指针,指向键空间(数据库级别的属性,指向保存的键值对)的某个键
- 过期字典的值是long long类型的整数,用于保存毫秒精度的unix时间戳
3.移除过期时间
persist key
4.判断是否过期
- 检查给定键是否在过期字典是否存在,如果存在则获取过期时间
- 检查当前UNIX时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则未过期
5.过期键删除策略
(1)定时删除:过期就马上删除。节省CPU内存,占用太多CPU时间(花费时间时刻盯着哪个键即将过期),影响服务器的响应时间和吞吐量。
(2)惰性删除:过期不删除,被访问才删除。浪费CPU内存存储,不花费CPU时间去删除,大量无用数据堆积在数据库中。
- 具体由db.c/expireIfNeeded函数实现,所有读写数据库的redis命令在执行之前都会调用该函数检查键是否过期:如果键已过期,则删除键;否则不改动。
- 读写数据库的redis命令必须能实现 键不存在 和 键存在以及是否过期 几种情况。
(3)定期删除:对时间空间的折中方案,每隔一段时间执行一次过期键删除操作,至于什么时候删除、多久删除一次根据具体情况合理设置。
- 具体由redis.c/activeExpireCycle函数实现,每当redis的周期性操作redis.c/serverCron函数执行时都会调用。在规定时间内,分多次遍历服务器中的各个数据库,从expires过期字典随机检查一部分键的过期时间,并删除其中的过期键。
redis服务器实际使用的是惰性删除和定期删除两种策略。
6.RDB对过期键的处理
- 生成RDB文件时直接忽略掉过期的键
- 载入RDB文件时,主服务器不会保存过期键,从服务器保留所有键
7.AOF对过期键的处理
(1)如果客户端访问没有被删除的过期键,则执行顺序如下
- 从数据库中删除过期键
- 追加一条删除命令进AOF文件
- 向客户端返回空
(2)AOF重写不会保存过期的键
8.主从复制对过期键的处理
- 主服务器删除一个过期键后,会通告所有从服务器发送一个del命令,让所有从服务器删除过期键
- 从服务器执行读指令时,遇到没有删除的过期键,依旧会返回一个值,也不会删除,当做未过期键一样处理;从服务器只有等主服务器发来del命令才会删除
参考&引用
《redis设计与实现》