Redis中关于过期键的删除策略

我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中,由Redis服务器来维护和管理这部分内存,内存是何足珍贵,不需要的数据或者是已经使用过的没用的数据是不会让它长久的存在于内存中的,毕竟我们还是要建设节约型社会的。所以我们可以通过给键设置生存时间或者过期时间来权衡有限的内存和不断增长的数据,设置过期时间的命令为:【expire key 时间长度(秒)】或者是【pexpire key 时间长度(毫秒)】 同时也可以通过【expireat key 时间点(Unix时间戳)】,可以通过TTL命令或者是pttl命令查看这个键还有多少剩余时间。

数据库中键的过期时间是保存在一个字典中的,这在Redis_字典中提到过了,本文主要说明的问题是过期键删除的问题,一个过期的键肯定不会让它长久的再存在于内存中,肯定是要对它进行删除的,建设节约型社会嘛,那么什么时候删除它呢?这里有三种不同的删除策略,我们逐一简单说明,很容易理解。

1,定时删除

什么是定时删除?顾名思义,就是我定个时间,到点就删除,有什么好处呢,对内存是最友好的,可以保证过期键会被尽快的删除掉,内存被尽早的释放出来,但是硬币都有两面啊,内存友好了,CUP时间呢,到点就删除到点就删除,CUP不干别的事了,光做删除过期键操作了,不现实,并且服务器还要创建大量的定时器,来实现定时删除,如果内存现在并不缺少,有空闲的内存,而这个时候有大量的命令请求在等待服务器处理,那么服务器也应该优先把CUP时间给处理客户端请求上,而不是删除过期键上。

所以定时删除不是一个完美的策略。

2,懒惰删除

同样,什么是懒惰删除,懒惰,懒得做删除操作,逼不得已我是不会去删除过期键的,懒到家了。

那么什么时候是逼不得已的时候呢,客户端现在取这个数据了,这个key已经过期了,明显不能返回给客户端,这个时候也就是懒到家的时候了,不删不行啊,客户端那边不愿意啊,可以看出,这个策略对内存是极不好的,没有建设节约型社会,但是CUP时间是最友好的,不会轻易动用CUP时间去删除过期键。

3,定期删除

定期?比定时时间长一点,不会时刻的去检查过期键,删除过期键,定期删除,是每隔一段时间检查一次数据库,删除里面的过期键,很明显定期删除是定时删除和懒惰删除的一个折中。

那么Redis中采用什么过期删除策略呢?

Redis时间上采用了惰性删除和定期删除两种策略配合使用,可以更好的使CUP时间和内存区的平衡

本文讨论Redis的过期键删除策略就不能不提AOF和RDB两种备份策略对过期键的处理

首先说一下RDB

我们知道服务器启动的时候如果开启了RDB功能,服务器会对RDB文件进行载入

这里分两种情况

1,主服务器模式,会被文件中的键进行检查,过期的键忽略,所以过期键对主服务器不会造成影响,

2,从服务器模式,无论过期不过期全部载入数据库中,不过主服务器在进行数据同步的时候,从服务器的数据会被清空,所以一般来说,对从服务器来说也不会造成影响

然后是AOF

记住一点,在执行AOF重写的时候,过期键不会被保存到重写后的AOF文件中,所以过期键不会对AOF造成影响。

还有就是主从复制的时候

主删除一个过期键,会显示的告诉从

从在执行客户端发送的读命令时,即使是过期键也不会删除过期键,而是像处理未过期键一样处理,从只有介绍到主的Del命令才会删除。

Redis 的详细介绍请点这里
Redis 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2015-07/120735.htm