redisDb结构(存储了数据库中所有的键值对)中有一个expires字典保存了数据库中所有键的过期时间。我们称这个字典为过期字典
-
过期字典的键是一个指针,这个指针指向键空间的某个键对象
-
过期字典的值是一个long long类型的整数,这个整数保存了键对象的过期时间--一个毫秒精度的UNIX时间戳
- 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键过期时间来临时,立即执行对键的删除操作
- 惰性删除:只有当再次访问键时,才会判断键是否过期,若过期则删除
- 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键。
redis采用的时惰性删除+定期删除的策略(定时删除对cpu太不友好了)。每隔一段时间redis从过期字典中随机检查一部分键的过期时间并删除其中的过期键。
AOF,RDB和复制功能对过期键的处理在生成和载入RDB文件时,会对键进行检查并自动忽略已过期的键。
在进行AOF文件写入时,不会对键进行检查,只有当过期键被删除时,才会在AOF文件中追加一条del指令
在进行AOF重写时,会对数据库中的键进行检查,已过期的键不会被保存在重写后的AOF文件中。
在复制模式下,从服务器过期键的删除由主服务器控制:
- 主服务器在删除一个过期键之后,会显式的向所有从服务器发送一个del指令通知从服务器删除过期键
- 当从服务器发现某个键过期后,会当没有发现,只有在主服务器发现过期键后并发送del指令从服务器才会删除过期键。