Redis-16-过期策略

上文中介绍了redis和spring boot的整合使用,本文再来看一下redis中的过期策略,算是对之前内容的一个补充

过期策略

在之前说命令行的时候,我们有给一个key设置过期时间,reids的过期策略就是说,一个key过期了的话redis会怎么处理这个key

过期策略通常有以下三种:

  • 定时过期: 每个设置过期时间的key都创建一个定时器,时间到了就立即清除. 这种策略可以立即清理过期的数据,对内存友好,但是会占用大量的CPU 资源去处理这些过期的数据,所以会影响缓存的响应时间和吞吐量
  • 惰性过期: 只有当访问一个key的时候,才会判断这个key是不是过期了,过期的话就清除掉,该策略可以最大化的节省CPU资源,但是对内存不友好,极端情况下可能会出现一大堆过期的key没有被访问,还留在内存中,占用资源
  • 定期过期: 每隔一定的时间,去扫描一定数量的数据库的expires字典中的一定数量的key,该策略是前面两个策略的一个折中的方案,通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果

redis中的过期策略及配置

Redis中同时使用了惰性过期和定期过期两种过期策略

定期删除可以通过以下两点去配置:

  • 配置redis.conf中的hz,默认是10(即1秒执行10次,100ms一次,值越大说明频率越高,对redis的性能损耗也越高)
  • 还可以通过配置redis.conf中的maxmemory去配置,当已用内存超过maxmemory限定的时候,就会触发主动清理策略

持久化时对过期key的处理

reids持久化是分为RDB和AOF持久化两种,下面分别看一下两种情况是如何处理的

RDB对过期key的处理

过期的key对RDB是没有任何影响的,从内存中持久化到RDB文件之前,会先检查key是否过期,过期的key是不进入到RDB文件中的

从RDB恢复到内存数据库中的时候,也会先检查key是否过期,过期的就不导入了

AOF对过期key的处理

过期key对AOF也是没有任何影响的, 当key过期还没有被删除,此时进行持久化,该key是不会进入aof文件的,因为没有发生修改的命令

当key过期掉,发生删除操作的时候,程序会向AOF文件追加一条del命令,在将来用aof文件恢复数据的时候,这个过期的key就会被删除掉

还有就是AOF重写,重写的时候会判断key是否过期,过期的key也是不会被重写到aof文件中的