Redis-0x0C-initServerConfig函数
这个方法的体量很大,作用是对redisServer
结构体成员进行初始化赋值,通篇大部分都是重复性劳动,比较有意思的是initConfigValues()
这个函数。这个函数体现了C语言的封装和多态的实现方式,在正式看源码之前先做一些前置性铺垫。
1 结构体成员赋值
结构体中的成员可以在实例化的时候指定要初始化的值,也可以只实例化不做初始化动作。指定初始化的时候可以指定要进行初始化的成员,一个或者多个成员都可以。
c
1 |
|
2 封装
封装是有目的的,一般是为了:
- 组织代码结构
- 屏蔽某些成员
- 开放某些成员
如果要实现继承,我能想到的方式有2种:
- 在结构体内存地址底部划分一块区域存放跟基类一样的成员,通过强转指针类型方式访问基类成员
- 在结构体中定义基类指针类型成员
c
1 |
|
3 多态
基于封装,实现运行时行为变化。
c
1 |
|
4 initConfigValues
有了上面内容的铺垫,再来看一下redis中initConfigValues
方法的多态实现。
4.1 configs数组
c
1 |
|
c
1 |
|
声明了数组,数组元素类型是standardConfig
,其中成员重要的是typeInterface
和typeData
,typeData
定义了多态实例下的数据,typeInterface
定义了多态实例的行为。
4.2 api
c
1 |
|
4.3 实例数据类型
c
1 |
|
目前一共定义了5种类型的数据,也就意味着需要定义5种数据结构,以及与之配套的api。
数据类型
- boolConfigData
- stringConfigData
- sdsConfigData
- enumConfigData
- numericConfigData
行为
- init
- set
- get
- rewrite
以后如果在此基础上扩展的话就很简单
- 首先在
typeData
这个结构体定义中增加数据类型 - 其次定义配套的api
4.4 以boolConfigData
为例的执行流程
4.4.1 configs
数组初始化
c
1 |
|
4.4.2 为每种类型提供适配的创建方法createxxxConfig
- createBoolConfig
- createStringConfig
- createSDSConfig
- createEnumConfig
- createIntConfig
- createUIntConfig
- createULongConfig
- createLongLongConfig
- createULongLongConfig
- createSizeTConfig
- createTimeTConfig
- createOffTConfig
上述方法的本质就是通过宏定义初始化结构体
c
1 |
|
4.4.3 多态执行
之后就是轮询数组中的standardConfig
元素进行多态执行。
c
1 |
|
4.4.4 init方法
上面的方法调用,之后就会根据实际的数据类型,调用绑定的方法。
以boolConfig
为例:
c
1 |
|
Redis-0x0C-initServerConfig函数
https://bannirui.github.io/2024/04/15/Redis/Redis-0x0C-initServerConfig函数/