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系統中,內部結構數據可放在共享內存中,這樣多進程均可訪問(如有須要可將數據的訪問接口實現成線程安全的),無需將數據在進程間進行傳遞。設計

相關文章
相關標籤/搜索