Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。1
2
3
4
5
6
7struct redisServer {
// 一个数组,保存着服务器中的所有数据库
redisDb *db;
// 服务器的数据库数量,默认为16
int dbNum;
}
Redis是一个键值对数据库服务器买服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间。1
2
3
4
5
6
7struct redisDb {
// 数据库键空间,保存着数据库中的所有键值对
dict *dict;
// 过期字典,保存着键的过期时间
dict *expires;
}
设置键的生存时间或过期时间
通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或毫秒数之后,服务器就会自动删除生存时间为0的键。
EXPIREAT或PEXPIREAT,以秒或者毫秒精度给数据库中的某个键设置过期时间。
TTL 查看过期时间,time to live
过期键删除策略
- 定时删除:在设定键的过期时间时,创建一个定时器,定时器定时删除
- 惰性删除:每次从键空间获取键时,检查是否过期
- 定期删除:每隔一段时间,程序对数据库检查,删除过期键
Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。
AOF、RDB和复制功能对过期键的处理
生成RDB文件
过期键不会被保存到RDB文件中
载入RDB文件
- 以主服务器模式运行,在载入的时候会对过期键进行检查
- 以从服务器模式运行,会载入全部的键,不过在主从同步的时候,会删除
AOF文件写入
过期键不会被保存到AOF文件中
复制
- 主服务器在删除一个过期键之后,会显示地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。
- 从服务器在执行客户端发生的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键。
- 从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。