这是我参与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个数据库。
服务器数据库示例
2、切换数据库
每个客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。
默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。
在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针:
typedef struct redisClient {
// ...
// 记录客户端当前正在使用的数据库
redisDb *db;
// ...
} redisClient;
下图表示客户端的目标数据库为1号数据库客户端状态和服务器状态之间的关系:
通过修改redisClient.db指针,让它指向服务器中的不同数据库,从而实现切换目标数据库的功能-----这就是SELECT命令的实现原理。
今天这一节先到这,下一节学习数据库中键空间的操作、键过期的实现及键过期策略。