Redis设计与实现-第9章-数据库

Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。

1
2
3
4
5
6
7
struct redisServer {
// 一个数组,保存着服务器中的所有数据库
redisDb *db;

// 服务器的数据库数量,默认为16
int dbNum;
}

Redis是一个键值对数据库服务器买服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间。

1
2
3
4
5
6
7
struct 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命令之后,才会删除过期键。