跟我一起来学习Redis中的数据库(上)

184 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

1、服务器中的数据库

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

struct redisServer {
    // 一个数组,保存着服务器中的所有数据
    redisDb *db;
    // 服务器的数据库数量
    int dbnum;
    // ...
};

  服务器初始化时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库,dbnum属性的值由服务器配置的database选项决定,默认情况下,该选项的值为16,所以Redis服务器默认会创建16个数据库。

image.png

服务器数据库示例

2、切换数据库

  每个客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。
  默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。

  在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针:

typedef struct redisClient {
    // ...
    // 记录客户端当前正在使用的数据库
    redisDb *db;
    // ...
} redisClient;

下图表示客户端的目标数据库为1号数据库客户端状态和服务器状态之间的关系:

image.png

  通过修改redisClient.db指针,让它指向服务器中的不同数据库,从而实现切换目标数据库的功能-----这就是SELECT命令的实现原理。

今天这一节先到这,下一节学习数据库中键空间的操作、键过期的实现及键过期策略。