数据库对象定义如下:
struct redisServer {
// ...
int dbnum; // 数据库数量
redisDb *db; // 数组保存redis中所有db
// ...
}
redisDb定义如下:
typedef struct redisDb {
// ...
dict *dict; // 数据库键空间,保存所有键值对
// ...
}
过期键删除
惰性删除
redis过期键惰性删除策略定义在db.c/expireIfNeeded
,所有对键的读写操作进行前都需要调用这个方法进行检查。若已过则清除键。
定期删除
redis过期键定期删除策略定义在redis.c/activeExpireCycle
,每当redis周期性执行redis.c/serverCron
的时候,都会执行。它在指定时间内,分批遍历各个数据库,从expires
中随机检查一部分键做过期检查。
RDB
rdb文件生成和加载时会过滤掉已过期的键