我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中。由Redisserver来维护和管理这部分内存,内存是何足珍贵,不须要的数据或者是已经使用过的无用的数据是不会让它长久的存在于内存中的,毕竟我们还是要建设节约型社会的。所以我们能够通过给键设置生存时间或者过期时间来权衡有限的内存和不断增长的数据。设置过期时间的命令为:【expire key 时间长度(秒)】或者是【pexpire key 时间长度(毫秒)】 同一时候也能够通过【expireat key
时间点(Unix时间戳)】,能够通过TTL命令或者是pttl命令查看这个键还有多少剩余时间。
数据库中键的过期时间是保存在一个字典中的,这在Redis_字典中提到过了,本文主要说明的问题是过期键删除的问题。一个过期的键肯定不会让它长久的再存在于内存中,肯定是要对它进行删除的。建设节约型社会嘛,那么什么时候删除它呢?这里有三种不同的删除策略。我们逐一简单说明,非常easy理解。
1,定时删除
什么是定时删除?顾名思义。就是我定个时间,到点就删除,有什么优点呢,对内存是最友好的,能够保证过期键会被尽快的删除掉,内存被尽早的释放出来,可是硬币都有两面啊,内存友好了,CUP时间呢。到点就删除到点就删除,CUP不干别的事了,光做删除过期键操作了,不现实,而且server还要创建大量的定时器,来实现定时删除。假设内存如今并不缺少,有空暇的内存,而这个时候有大量的命令请求在等待server处理,那么server也应该优先把CUP时间给处理client请求上。而不是删除过期键上。
所以定时删除不是一个完美的策略。
2。懒惰删除
相同,什么是懒惰删除。懒惰,懒得做删除操作,逼不得已我是不会去删除过期键的,懒到家了。
那么什么时候是逼不得已的时候呢,client如今取这个数据了。这个key已经过期了。明显不能返回给client。这个时候也就是懒到家的时候了。不删不行啊,client那边不愿意啊,能够看出。这个策略对内存是极不好的,没有建设节约型社会,可是CUP时间是最友好的,不会轻易动用CUP时间去删除过期键。
3,定期删除
定期?比定时时间长一点,不会时刻的去检查过期键。删除过期键,定期删除。是每隔一段时间检查一次数据库。删除里面的过期键,非常明显定期删除是定时删除和懒惰删除的一个折中。
那么Redis中採用什么过期删除策略呢?
Redis时间上採用了惰性删除和定期删除两种策略配合使用,能够更好的使CUP时间和内存区的平衡
本文讨论Redis的过期键删除策略就不能不提AOF和RDB两种备份策略对过期键的处理
首先说一下RDB
我们知道server启动的时候假设开启了RDB功能,server会对RDB文件进行加载
这里分两种情况
1,主server模式,会被文件里的键进行检查,过期的键忽略,所以过期键对主server不会造成影响,
2,从server模式,不管过期只是期所有加载数据库中,只是主server在进行数据同步的时候,从server的数据会被清空,所以一般来说,对从server来说也不会造成影响
然后是AOF
记住一点,在运行AOF重写的时候,过期键不会被保存到重写后的AOF文件里,所以过期键不会对AOF造成影响。
还有就是主从复制的时候
主删除一个过期键,会显示的告诉从
从在运行client发送的读命令时,即使是过期键也不会删除过期键,而是像处理未过期键一样处理。从仅仅有介绍到主的Del命令才会删除