C语言实现一种简单的应用服务器内部数据结构的思路(二)

    本文在前文的基础上作了一下扩展安全

内部数据结构定义

内部的数据结构配置文件可采用xml文件形式,文件格式其实很简单,例子以下
<DataDef>
    <Field key="cardNo" length="19"/>
    <Field key="amount" length="13"/>
    <Field key="tradeDate" length="8"/>
    <Field key="tradeTime" length="6"/>
</DataDef>
好比此次内部结构含4个字段,含一次交易信息的卡号,金额,交易日期,交易时间,载入这个配置后,内存中的数据映射关系以下:
数据key 长度 偏移
cardNo 19
amount 13 20
tradeDate 8 36
tradeTime 6 48
考虑到计算效率,好比32系统中,实际分配的存储长度是比xml文件配置的长度大的最小的4的整数倍数,这样偏移量就是4的整数倍。

数据内部存储与访问方式

数据的内部存储方式可用字符串形式,无论是整数,浮点数,数据读取和写入的接口最核心的就是相似这种形式: 数据结构

int getDataStr(const void* dataAddr, const char* szKey, const int iBufLen, char* szValue);
int putDataStr(void* dataAddr, const char* szKey, const char* szValue);

dataAddr是全部的数据存储地址,根据szKey查找到对应数据的偏移(若是数据域多可在载入配置后可将key排序,查找时经过二分查找等方法),以后进行读取或者写入,至于其余的类型在这个基础上将字符与成整型,浮点型等互转便可。并且数据内部自然带长度,在写入的时候能够进行检查,不能超过xml文件中的长度,在一个地方限制了内存溢出的BUG。线程

int getDataInt(const void* dataAddr, const char* szKey, int* iValue);
int setDataInt(void* dataAddr, const char* szKey, const int iValue);
int getDataDouble(const void* dataAddr, const char* szKey, double* dValue);
int setDataDouble(void* dataAddr, const char* szKey, const double dValue);

到此已经完成了一个最简单的设计,相对真正的动态Map的实现最大的区别是全部用到的值的key必须预先定义好,可是值所放置的位置在载入时都已经肯定,在访问时不须要进行动态的内存申请和释放,保证了必定的效率,并且在Linux/Unix系统中,内部结构数据可放在共享内存中,这样多进程均可访问(如有须要可将数据的访问接口实现成线程安全的),无需将数据在进程间进行传递。设计

相关文章
相关标签/搜索