程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 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的博客”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved