Redis过期时间及过期策略
一、基本命令Redis中我们可以通过EXPIRE和PEXPIRE来设置键的生存时间(TTL),通过命令,客户端可以经过指定的秒或者毫秒为精度,对数据库中的特定键设置生存时间;同样,我们可以通过EXPIREAT命令或者PEXPIREAT命令,以秒或者毫秒精度给数据的某个键设置过期时间(expire time),其中过期时间是一个UNIX时间戳,当某个键达到国企时间时,服务器会自动从数据库中删除该键;
一、基本命令
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命令后,才会删除过期键。
更多推荐
所有评论(0)