本文在前文的基礎上做了一下擴展
內部數據結構定義
內部的數據結構配置文件可采用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的博客”