当前位置:编程学习 > C/C++ >>

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

 本文在前文的基础上做了一下扩展

内部数据结构定义
内部的数据结构配置文件可采用xml文件形式,文件格式其实很简单,例子如下
1
<DataDef>
2
    <Field key="cardNo" length="19"/>
3
    <Field key="amount" length="13"/>
4
    <Field key="tradeDate" length="8"/>
5
    <Field key="tradeTime" length="6"/>
6
</DataDef>
比如这次内部结构含4个字段,含一次交易信息的卡号,金额,交易日期,交易时间,载入这个配置后,内存中的数据映射关系如下:
数据key 长度 偏移
cardNo 19 
amount 13 20
tradeDate 8 36
tradeTime 6 48
考虑到计算效率,比如32系统中,实际分配的存储长度是比xml文件配置的长度大的最小的4的整数倍数,这样偏移量就是4的整数倍。
数据内部存储与访问方式
数据的内部存储方式可用字符串形式,不管是整数,浮点数,数据读取和写入的接口最核心的就是类似这种形式:

1
int getDataStr(const void* dataAddr, const char* szKey, const int iBufLen, char* szValue);
2
int putDataStr(void* dataAddr, const char* szKey, const char* szValue);
dataAddr是所有的数据存储地址,根据szKey查找到对应数据的偏移(如果数据域多可在载入配置后可将key排序,查找时通过二分查找等方法),之后进行读取或者写入,至于其他的类型在这个基础上将字符与成整型,浮点型等互转即可。而且数据内部天然带长度,在写入的时候可以进行检查,不能超过xml文件中的长度,在一个地方限制了内存溢出的BUG。

1
int getDataInt(const void* dataAddr, const char* szKey, int* iValue);
2
int setDataInt(void* dataAddr, const char* szKey, const int iValue);
3
int getDataDouble(const void* dataAddr, const char* szKey, double* dValue);
4
int setDataDouble(void* dataAddr, const char* szKey, const double dValue);
到此已经完成了一个最简单的设计,相对真正的动态Map的实现最大的区别是所有用到的值的key必须预先定义好,但是值所放置的位置在载入时都已经确定,在访问时不需要进行动态的内存申请和释放,保证了一定的效率,而且在Linux/Unix系统中,内部结构数据可放在共享内存中,这样多进程都可访问(若有需要可将数据的访问接口实现成线程安全的),无需将数据在进程间进行传递。

作者“OneThin的博客”

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,