相較于內存加載結合hash表的存取方法,本發明專利技術提供的一種基于B+樹的用戶卡狀態名單存取方式取消了hash計算操作,解決因hash碰撞造成的數據沖突。本發明專利技術引入用戶卡槽的聚合模型,對相同槽下的b+樹可以實現并發寫入,極大地提升數據寫入性能,加載完成4450萬用戶卡狀態名單耗時僅需110秒。結合b+樹的存取特性,將用戶卡狀態名單單條記錄壓縮到28字節,全量加載完僅需1.16G內存空間,有效的降低了ETC收費系統的建設成本,提升了系統的健壯性和魯棒性。在查詢效率方面,采用本發明專利技術提供的技術方案后,單記錄命中耗時不到1ms,相較于hash查找算法耗時略有增加,但依然能夠滿足ETC收費系統的高效運作。統的高效運作。統的高效運作。
【技術實現步驟摘要】
一種基于B+樹的ETC收費系統用戶卡狀態名單存取方法
[0001]本專利技術涉及一種數據寫入和檢索方法,尤其涉及一種基于B+樹的高速公路用戶卡狀態名單存取方法,屬于智能交通領域。
技術介紹
[0002]自2015年9月28日,全國高速公路電子不停車收費實現全國聯網,用戶實現一卡暢行全國,全國31個(省)(直轄市)(自治區),全部實現了高速公路ETC聯網收費,實現全國高速公路ETC聯網通行,用戶在任意省份辦理ETC通行卡,即可通行全國。
[0003]隨著ETC卡發行量的增加,因用戶注銷、卡遺失、欠費停用等原因被添加用戶狀態的用戶卡信息也隨之增加。截至2022年5月,全國ETC用戶卡狀態名單數量已達4450萬。
[0004]用戶卡狀態名單包含以下主要屬性:
[0005]1)用戶卡號:40字節長度的字符串,用于用戶卡的唯一標識;
[0006]2)狀態名單創建時間:時間類型,用于標識該狀態名單的發布時間;
[0007]3)狀態名單生效時間:時間類型,用于標識該狀態名單的生效時間;
[0008]4)操作類型:整數類型,用于標識該狀態名單的操作類型,如卡注銷、余額不足等;
[0009]5)操作狀態:整數類型,用標識該狀態名單的處理狀態,如進入黑名單、解除黑名單;
[0010]6)發行方:12字節長度的字符串,用于標識該用戶卡所屬發行單位。
[0011]在用戶卡狀態名單的設計中允許同一張卡存在多個狀態,最終的用戶狀態由多個狀態合并。在ETC收費系統中,為了保證車輛的快速通行,系統處理各環節的處理時效性要求極高。
[0012]目前,為了確保ETC收費系統的處理效率,用戶卡狀態名單采用內存加載結合hash查找的方式實現。單個用戶卡狀態名單存儲需要使用92字節——用戶卡號40字節+狀態名單創建時間8字節+狀態名單生效時間8字節+操作類型4字節+操作狀態4字節+發行方12字節+對象描述符8字節+8字節的hash碼。因此,加載4450萬名單共需要3.8G內存空間。使用hash表查詢算法需要計算用戶卡號的hash值,對于4450萬用戶卡狀態名單,計算hash值并加載到內存需要耗時20分鐘左右。
[0013]因此,在ETC收費系統中使用內存加載結合hash查找實現用戶狀態存取方法存在以下弊端:
[0014]1)內存占用較大
[0015]ETC收費系統除用戶卡狀態名單外還存在其他需要加載到內存的運行數據,增加內存的使用會提升ETC收費系統的建設成本;同時較大的內存占用不利于軟件常態化運作的管理,在運維場景下高內存的占用降低了系統的健壯性和魯棒性。
[0016]2)hash算法存在hash碰撞,造成不同的用戶卡號被計算為相同的hash值,hash碰撞的存在需要重新設計hash跳表來確保相同hash值下不同用戶卡號的映射關系,提升了軟件代碼的復雜度,降低了系統的健壯性。
[0017]3)加載耗時需要20分鐘以上的現狀也對ETC收費系統快速運作、高效運轉的要求帶來較大的挑戰。
[0018]綜上所述,在用戶卡狀態名單存取場景下,使用內存加載結合hash表的方法很難達到滿意的效果。
技術實現思路
[0019]本專利技術要解決的技術問題是:在ETC收費系統中使用內存加載結合hash查找實現用戶狀態存取方法存在內存占用較大、軟件代碼復雜度高以及加載耗時的缺陷。
[0020]為了解決上述技術問題,本專利技術的技術方案是提供了一種基于B+樹的ETC收費系統用戶卡狀態名單存取方法,其特征在于,包括以下步驟:
[0021]第一步、將用戶卡狀態名單轉化為單鏈數據結構dictionary實例,其中,鏈數據結構dictionary包括用于記錄用戶卡號的key字段、用于記錄用戶卡狀態信息的value字段以及用于存儲指向其它單鏈數據結構dictionary實例的指針的next字段;
[0022]第二步、在寫入用戶卡狀態名單時,對于當前單鏈數據結構dictionary實例的處理包括以下步驟:
[0023]步驟1、獲得當前單鏈數據結構dictionary實例的key字段的值Key,查找與當前用戶卡槽對應的B+樹實例中各葉子節點的key數組每個key元素值:
[0024]若在當前key數組中存在等于值Key的key元素值,則將等于值Key的key元素值定義為當前key元素值,進入步驟6;
[0025]若在當前B+樹實例中未查找到等于值Key的key元素值,但在當前key數組中存在小于值Key的key元素值,則將與當前key數組對應的葉子節點作為當前葉子節點,進入步驟3;
[0026]若在當前B+樹實例中未查找到小于等于值Key的key元素值,則進入步驟2;
[0027]步驟2、新建葉子節點,將新建的葉子節點作為當前葉子節點,進入步驟3;
[0028]步驟3、判斷當前葉子節點是否已滿:若當前葉子節點已滿,則分裂當前葉子節點,將分裂得到的葉子節點作為新的當前葉子節點,進入步驟4;若當前葉子節點未滿,則直接進入步驟4;
[0029]步驟4、將值Key作為一個key元素值存入當前葉子節點的key數組中,并對key數組中所有key元素值重組排序,獲得重組排序后值Key在當前key數組中的排序序號k,進入步驟5;
[0030]步驟5、新建第k個value數組,依據當前單鏈數據結構dictionary實例的next字段,在第k個value數組的對應位置存入當前單鏈數據結構dictionary實例;
[0031]步驟6、獲取當前key元素值所對應的value數組及其中存儲的第一個單鏈數據結構dictionary實例,將該單鏈數據結構dictionary實例定義為上一個單鏈數據結構dictionary實例,進入步驟7;
[0032]步驟7、若上一個單鏈數據結構dictionary實例的next字段為空,則將上一個單鏈數據結構dictionary實例的next字段指向當前單鏈數據結構dictionary實例,在當前單鏈數據結構dictionary實例存入當前value數組中,且當前單鏈數據結構dictionary實例在當前value數組中的位置位于上一個單鏈數據結構dictionary實例之后;若上一個單鏈數
據結構dictionary實例的next字段非空,則進一步獲得單鏈數據結構dictionary實例的next字段指向的下一個單鏈數據結構dictionary實例,將所獲得的下一個單鏈數據結構dictionary實例定義為新的上一個單鏈數據結構dictionary實例后,返回步驟7循環執行;
[0033]在查詢查詢用戶卡狀態名單時,在B+樹實例中進行查詢。
[0034]優選地,第一步中,進行用戶卡狀態名單轉化時,將用戶卡號的前N個字符截取作為用戶卡槽,同一用戶卡槽對應一個B+樹實例,則用戶卡號前四位相同的數據聚合在一個B+樹中;
[0035]第二步中,在查詢查詢用戶卡本文檔來自技高網...
【技術保護點】
【技術特征摘要】
1.一種基于B+樹的ETC收費系統用戶卡狀態名單存取方法,其特征在于,包括以下步驟:第一步、將用戶卡狀態名單轉化為單鏈數據結構dictionary實例,其中,鏈數據結構dictionary包括用于記錄用戶卡號的key字段、用于記錄用戶卡狀態信息的value字段以及用于存儲指向其它單鏈數據結構dictionary實例的指針的next字段;第二步、在寫入用戶卡狀態名單時,對于當前單鏈數據結構dictionary實例的處理包括以下步驟:步驟1、獲得當前單鏈數據結構dictionary實例的key字段的值Key,查找與當前用戶卡槽對應的B+樹實例中各葉子節點的key數組每個key元素值:若在當前key數組中存在等于值Key的key元素值,則將等于值Key的key元素值定義為當前key元素值,進入步驟6;若在當前B+樹實例中未查找到等于值Key的key元素值,但在當前key數組中存在小于值Key的key元素值,則將與當前key數組對應的葉子節點作為當前葉子節點,進入步驟3;若在當前B+樹實例中未查找到小于等于值Key的key元素值,則進入步驟2;步驟2、新建葉子節點,將新建的葉子節點作為當前葉子節點,進入步驟3;步驟3、判斷當前葉子節點是否已滿:若當前葉子節點已滿,則分裂當前葉子節點,將分裂得到的葉子節點作為新的當前葉子節點,進入步驟4;若當前葉子節點未滿,則直接進入步驟4;步驟4、將值Key作為一個key元素值存入當前葉子節點的key數組中,并對key數組中所有key元素值重組排序,獲得重組排序后值Key在當前key數組中的排序序號k,進入步驟5;步驟5、新建第k個value數組,依據當前單鏈數據結構dictionary實例的next字段,在第k個value數組的對應位置存入當前單鏈數據結構dictionary實例;步驟6、獲取當前key元素值所對應的value數組及其中存儲的第一個單鏈數據結構dictionary實例,將該單鏈數據結構dictionary實例定義為上一個單鏈數據結構dictiona...
【專利技術屬性】
技術研發人員:鄭文,邱曉東,王玲,王洋洋,史強強,朱國磊,
申請(專利權)人:上海電科市政工程有限公司,
類型:發明
國別省市:
還沒有人留言評論。發表了對其他瀏覽者有用的留言會獲得科技券。