Redis设计与实现第二部分:第9章:单机数据库的实现

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)。

  

猜你喜欢

转载自www.cnblogs.com/luoshengjie/p/10239275.html
今日推荐