述
上文中介绍了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文件中的