9.1:服务器中的数据库
Redis服务器将所有的数据库都保存在服务器状态 redis.h/redisServer 结构的db数组中,db数组的每个项都是一个 redis.h/redisDb 结构,每个redisDb结构都是一个数据库:
1 struct redisServer{ 2 3 //... 4 5 //一个数组,保存着服务器中所有的数据库 6 redisDb *db; 7 8 //服务器数据库数量 9 int dbnum; 10 //... 11 };
在初始化数据库时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库,dbnum属性的值是由服务器配置的database选项决定,默认情况下,该选项值为16,所以Redis服务器会默认创建16个数据库,如下图所示:
9.2 切换数据库
每个Redis客户端都有自己的数据库目标,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。
默认情况下,Redis客户端的目标数据库为0号数据库,但客户端也可以通过执行 SELECT 命令切换目标数据库。
在服务器内部,客户端状态 redisClient 结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针。
typedef struct redisClient{ //... //记录当前客户端正在使用的数据库 redisDb *db; //... }redisClient;
redisClient.db 指针指向 redisServer.db 数组的其中一个元素,而被指向的元素就是客户端的目标数据库。
通过修改redisClient.db 指针,让它指向服务器不同的数据库,从而实现切换目标数据库的功能,这就是SELECT命令的原理。
备注:Redis没有返回客户端目标数据库的功能。
9.3 数据库键空间
Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都是由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key sapce)。