每个系统都会有类似一个config配置文件,config文件里的内容想想都知道,一定就是那么一些固定的一行行的属性代码了,今天在看redis代码中的config属性,那拉下来的一笔,的确多,目测在50至100个属性左右。如果就此将config每个属性代表什么意思不是我的风格,也一定是很乏味的,所以我的特点就是在代码中去理解程序员在写这类代码时的思路,和茫茫代码中的亮点。我们知道,redis运行的环境包括很多种的,windows,Linux,mac os等等,不同的操作系统,当然有些属性就不能支持了,所以在redis中的config.h头文件中跟据计算机所属于的操作系统,做了很多的预处理,比如说,在Linux等系统上,是可以支持修改进程名称的:
/* Check if we can use setproctitle().
* BSD systems have support for it, we provide an implementation for
* Linux and osx. */
/* 检查是否能调用setproctitle(),这个方法是Linux上修改进程名称的方法 */
/* 这里通过判断是否是BSD系统,BSD是Berkeley Systems Distrobution的缩写,是一种UNIX版本 */
#if (defined __NetBSD__ || defined __FreeBSD__ || defined __OpenBSD__)
#define USE_SETPROCTITLE
#endif
#if (defined __linux || defined __APPLE__)
#define USE_SETPROCTITLE
#define INIT_SETPROCTITLE_REPLACEMENT
void spt_init(int argc, char *argv[]);
void setproctitle(const char *fmt, ...);
#endif
当然这只是我提到的一点,也就是说,redis在异构系统的处理上,考虑的还是非常周全的。我们主要看看config主要的操作文件,先看看里面的一些API:
/* Config file API */
int yesnotoi(char *s) /* 判断字符是否为yes */
void appendServerSaveParams(time_t seconds, int changes) /* 追加server save参数 */
void resetServerSaveParams(void) /* 重置server的save参数,即释放server的serverParams */
void loadServerConfigFromString(char *config) /* 从字符串中加载server属性配置 */
void loadServerConfig(char *filename, char *options) /* 从文件中加载server配置 */
void configSetCommand(redisClient *c) /* 根据redisClient中的参数设置server的配置 */
#define config_get_string_field(_name,_var) /* 宏定义