Author:赵志乾
Date:2018-12-01
Declaration:All Right Reserved!!!
1、Redis服务器信息
部署Redis服务的服务器称为Redis服务器,其服务器的相关配置以优化Redis服务为终极目标,此类为物理服务器。Redis服务器上我们会起一些服务器实例,此类为软件服务器。以下如无特殊说明,Redis服务器均指软件服务器。在Redis服务器中,整个服务器的状态信息(Redis相关)均由一个redisServer结构体来维护。该结构体的详细定义见server.h文件。
redisServer作为一个维护Redis服务器状态的内存结构,其内部包含大量的属性字段。在关注客户端如何确定要操作的具体数据库时,我们可先暂时只关注其中的一个属性字段:db。db字段的类型是一个指向redisDB的指针。在Redis服务器上通常不止一个数据库,其用一个数组来整合所有的数据库,而redisServer中的db属性字段则指向用于维护数据库的数组首地址。结构如下:
注:数据库数组的长度由redisServer中的dbnum属性字段指定,其值在初始化时由配置文件中的database属性指定。默认情况下其值是16,故Redis服务器在启动时,默认情况下会创建16个数据库。
2、Redis客户端信息
客户端在向服务端发送读或写指令时,只会操纵数据库数组中的某一个。服务器端为了确定客户端要操作的具体数据库,会在内存中为每一个客户端维护一个client结构体。该结构体同样包含许多属性字段,现在我们只关心其中的db属性字段。client中的db字段同样为指向redisDb的指针,用于表征该客户端的目标数据库,其值为数据库数组中某一元素的地址。默认情况下,client.db指向的是标号为0的数据库,在具体的操作过程中,可以通过select指令完成目标数据库的切换。其结构如下:
故Redis指令中的select工作原理就是更改client结构体中的db的指向。由于此类关联关系维护在服务器端,为了保证一个客户端在不同时刻准确的操作不同数据库,通常会先用select选中指定目标数据库,以防出现误操作。
3、Redis客户端信息查看
使用client list指令,可以查看Redis服务器当前活跃客户端的信息,指令原理见《客户端与服务器关系维护》。上文中提到通过select指令可以切换Redis客户端的目标数据库,实例如下图。从中可以看出,刚启动的Redis客户端,其db值为0,表示使用的是0号数据库,使用select指令更换为1号数据库后,其db值为1。而默认情况下,将目标数据库切换为16号数据库时,报数据库下标越界,即默认配置时,Redis服务器拥有16个数据库,标号从0到15。
参考资料:
《Redis设计与实现》---黄健宏
2018-12-01 非稳定版本Redis源码