key的过期时间都保存在过期字典中,如果一个键过期了,那么redis什么时候会被删除呢?
删除策略
(1)惰性删除
对key进行操作时才进行过期检查,对CPU最为友好,因为只有在不得不做的适合才进行操作,并且只涉及当前的目标key,与其他key无关,不浪费CPU资源
同样也有缺点,它对内存是最不友好的,如果一个键已经过期,那么只要以后没有对它进行操作,它所占用的内存就不会释放,当这样的key越来越多时,内存浪费就很严重了
Redis当执行任何读写命令时,先调用过期检查函数,如果此key过期,先执行删除操作,然后再进行当前命令的操作
(2)定期删除
每隔一段时间对数据库执行一次过期key检查,并通过对删除操作的执行时间和频率进行限制,来尽量减少对CPU的占用时间
定期删除有效降低了对内存的浪费,比较平衡的兼顾了CPU与内存
Redis有周期性系统操作函数,会分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键
持久化过程对过期key的处理
(1)RDB方式
生成RDB文件时会检查key是否过期,过期的直接过滤掉,不进行保存操作
(2)AOF方式
在每个命令执行时都会检查key是否过期,如果过期,会显示调用删除key的命令,所以此命令也会被写入AOF文件
(3)AOF重写
和RDB方式的处理过程一样,会先检查key是否过期,过滤掉过期的key
主从复制过程对过期key的处理
(1)master中按照正常的删除策略执行
(2)slave的过期key删除由主服务器控制:
master执行过期key删除操作后,显式向slave发送删除命令,slave在收到删除命令之前,对过期key不做删除,如果收到客户端的命令请求,正常执行命令,收到删除命令后才进行删除