◆孫 超
Redis內存數據庫在智慧消防系統設計中的應用
◆孫 超
(公安部沈陽消防研究所 遼寧 110034)
智慧消防系統是一種將GPS(全球衛星定位系統)、GIS(地理信息系統)、GSM(無線移動通信系統)和計算機、物聯網及大數據等技術集于一體的智能消防無線報警網絡服務系統。將Redis內存數據庫應用于智慧消防系統的設計中,可以使智慧消防數據查詢滿足高訪問量、操作方便的現實需求,為智慧消防的大數據存儲設計提供了有效的參考。
智慧消防;物聯網;大數據;Redis內存數據庫
智慧消防系統[1]是一種將GPS(全球衛星定位系統)、GIS(地理信息系統)、GSM(無線移動通信系統)和計算機、物聯網和大數據[2]等技術集于一體的智能消防無線報警網絡服務系統。隨著信息技術的深度發展,人類已進入大數據時代,消防行業面臨著前所未有的巨大挑戰與機遇,傳統消防系統工作方式與新形勢、新任務不相適應的矛盾日益凸顯。在物聯網產業迅猛發展的大背景下,必須主動運用大數據來解決了電信、建筑、供電、交通等公共設施建設協調發展的問題。在智慧消防系統中,消防指揮中心與用戶單位聯網,改變了過去傳統、落后和被動的報警、接警、處警方式,實現了報警自動化、接警智能化、處警預案化、管理網絡化、服務專業化、科技現代化,大大減少了中間環節,極大地提高了處警速度,真正做到了方便、快捷、安全、可靠,使人民生命、財產的安全以及警員生命的安全得到最大限度的保護。
Redis[3](Remote dictionary server) 是一款開源的、網絡化的、基于內存的、可進行數據持久化的 Key-Value[4]存儲系統。它的數據模型建立在外層,類似于其他結構化存儲系統,是通過Key映射Value的方式來建立字典以保存數據,有別于其他結構化存儲系統的是,它支持多種數據類型的存儲:字符串(string)、鏈表(list)、集合(set)、有序集合(zset) 和哈希類型 (hash),并且各種類型都支持豐富的操作,其中大多都支持原子操作。為了保證數據存取的效率,數據都保存在內存中。Redis還提供了對持久化的支持[5],它可以定期將更新的數據異步寫入磁盤,同時不影響繼續提供服務。在此基礎上,還實現了主從復制,這對預防單點故障和提高負載能力有很大幫助。在操作方面,Redis 基于TCP協議的特性使得它可以通過管道的方式進行數據操作[6]。Redis 本身提供了一個可連接Server 的客戶端,通過客戶端可方便地進行數據存取操作。
在智慧消防底層數據庫設計中,完全可以應用Redis數據存儲系統,以滿足高訪問量與操作方便的需求[7]。在操作方面,應用Redis的管道通訊方式進行數據操作,通過Redis 本身的客戶端,可以同時連接Server服務器,方便地進行數據存取操作。常用的消防產品信息如:產品的生產企業、型號、證書編號、地理位置信息與應急救援指示信息等較復雜的信息等信息可以以字符串的格式存儲在Redis的底層數據結構中。通過hash結構存儲,并通過可以唯一標識產品信息的主鍵建立不同數據表中各條產品信息的聯系,構建底層信息字典。利用Redis 底層數據結構對字符串和字典數據的高效支持,可以達到快速查詢的目的。
在字符串數據的實現中,采用SDS(Simple Dynamic String,簡單動態字符串)取代了功能單一,抽象層次低,并且不高效的char*類型字符串。在字典數據的實現中,為了兼顧高效和簡單性,使用了哈希表。在實現哈希表時,有一個問題就是采用何種策略來解決碰撞問題。對于使用鏈地址法來解決碰撞問題的哈希表來說,哈希表的性能取決于哈希表大小與保存節點數量之間的比率。RDB 將數據庫的快照以二進制的方式保存到磁盤中。在Redis運行時,RDB程序將當前內存中的數據庫快照保存到磁盤文件中,在Redis重啟動時,RDB程序可以通過載入RDB文件來還原數據庫的狀態。AOF則以協議文本的方式,將所有對數據庫進行過寫入的命令(及其參數)記錄到AOF文件,以此達到記錄數據庫狀態的目的。AOF更像是歷史記錄,記錄所有運行過的命令。但是AOF文件就會隨著時間持續增長,進而占據整個磁盤。為此,Redis 設計了AOF 重寫機制,通過開啟新線程,掃描數據庫數據,將其轉化為Redis命令,存入臨時的AOF文件。當掃描完后,用臨時文件代替AOF文件。這樣一來,AOF 文件中記錄的命令就是最簡潔的,因而不會占據很多空間。
Redis 兼具內存數據庫隨機訪問的優勢和Key-Value數據模型簡單高效的特點,因此,其 I/O性能非常優異,支持高并發性,豐富的數據結構適合存儲何種復雜的數據。考慮到社會對智慧消防數據服務的實時響應、高并發、高吞吐量提出了更高的需求,且大多數消防產品信息數據服務后臺數據量并不大,大容量、低價格的內存使得以內存數據庫的輕量級空間數據應用成為可能。本文以內存數據庫Redis為平臺,利用其響應速度快、并發性高、數據結構豐富的優勢,研究了Redis的輕量級數據的高效組織和索引方法,提升高并發訪問下消防產品信息數據服務的響應速度和查詢性能。
Redis本身存儲是一個巨大的Hash表,為了模仿關系型數據庫的表,通常使用分隔符分隔“表名”以及“字段”,本文使用”:”作為分隔符。例如存儲一個消防產品的屬性信息,可以表示為Product:ProductID作為key,并用hash結構存儲消防產品屬性信息。field域包括:產品名稱(ProductName)、產品型號(ProductType)、出廠日期(Date of Product)、技術參數(TechnicalParameters)、證書編號(CertificateNumber)、安裝位置(InstallationSite)和報警記錄(AlarmRecord)等字段。value域包含實際的存儲信息。在每一個消防產品投入到智慧消防云平臺前,系統會為其賦予唯一的產品編號ProductID,因此該key是唯一的。

表1 Redis中hash數據結構設計示例
本文采用主從方式進行系統配置,共有3個主(master)節點,3個從(slave)節點,采用全雙工通信方式,最大客戶端連接數設置為10000,系統為每個節點分配的最大內存為1000MB。采用Java虛擬機環境, Jvm主處理單元配置為4核Intel(R) Xeon(R) CPU E7-4830 v2 @ 2.20GHz,內存31GB,操作系統選擇NeoKylin Linux Advanced Server release 6.0。緩存集群服務器主處理器配置為4核Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz,內存5.5GB,操作系統選擇Red Hat Enterprise Linux Server release 6.3。
智慧消防是一個全新的概念和理念,目前尚處于發展階段,還沒有權威和統一的定義和標準。根據智慧消防模型設計的理念[8],模擬出能夠體現消防產品信息,消防產品安裝位置信息和消防產品地理位置信息等數據,根據這些信息生成智慧消防系統的模擬數據。在消防產品入網前,為每一個產品分配唯一的ProductID,以作為該產品在系統中唯一的標識。考慮到消防數據的復雜與多樣性[9],在模擬數據時,盡可能地選擇了多的可能體現消防產品信息的數據,考慮到不同的表中要素的個數不同,共生成了2個數據表Ka100和Ac001,其中Ka100中數據盡可能多地體現了產品的信息,表中所含要素個數為27891個,Ac001盡可能多地體現了產品的位置信息,表中所含要素個數為46254個,2張表格中分別具有消防產品信息數據10萬條。
考慮到智慧消防系統在實際應用中,寫緩存業務單次不會超過5萬條,因此將測試的數據量上限設為5萬。當緩存服務器宕機或其他因素導致緩存不可用時,程序會將單次上傳的所有數據存入一條zz01的blob(binary large object)類型字段中,其中blob的最大容量為2GB。下面本文對寫緩存成功的時間,寫緩存失敗的時間以及緩存失敗時存入blob的數據量進行了測試。測試結果如下圖1、圖2。

圖1 寫緩存數據時間測試

圖2 緩存失敗時存入blob的數據量測試
通過對測試結果進行分析,可以看出緩存同步時間隨著數據量的增加基本呈現線性增長的趨勢,當數據量達到5萬條時,Ac001大小為18.6MB,Ka100大小為18MB,而blob最大可以容納2GB,不會發生溢出。這樣的結果說明,Redis寫緩存的實現過程完全可以滿足智慧消防系統實際應用中大數據量同時寫入緩存的需求。
本文中共使用2個數據表Ka100和Ac001,其中Ka100中數據盡可能多的體現了產品的信息,表中所含要素個數為27891個,Ac001盡可能多地體現了產品的位置信息,表中所含要素個數為46254個,2張表格中分別具有消防產品信息數據10萬條。在Redis環境和普通數據庫環境下,分別對兩張表中不同條數的數據進行了查詢,測試結果取5次測試的平均值,計算出平均查詢時間。

圖3 針對Ka100表的Redis和Oracle數據庫查詢響應時間對比

圖4 針對Ac001表的Redis和Oracle數據庫查詢響應時間對比
如上圖3、圖4,從測試結果中可以看出,無論什么數據,Redis環境都比Oracle環境下耗時少得多。因為Oracle使用的是R樹空間索引,而Redis使用的是網格索引,通常來講,R樹空間索引的效率要高于網格索引的效率,但Redis在網格索引的支持下,效率仍然高于Oracle,說明Redis在智慧消防數據的查詢上,效率更高。另外,Redis作為內存型數據庫,數據存放在內存中,數據查詢可以得到快速響應,而傳統的關系型數據庫Oracle,需要將數據存放在硬盤中,需要先傳輸到內存中,才能得到響應,受制于I/O傳輸瓶頸,查詢效率明顯低于Redis數據庫。
消防物聯網的技術發展,將給消防事業帶來全新的方法與途徑,將徹底改變消防產品生產與消防監管模式[10]。智慧消防的發展乃是大勢所趨,它是社會發展和人們生活水平提高到一定程度后的必然需求[11]。但智慧消防的實現,不僅需要消防從業人員的努力,同時需要與物聯網和大數據等技術進一步結合[12]。本文提出的Redis在智慧消防系統設計中的設計,實現了智慧消防數據庫系統的Redis模型的建立。試驗結果表明,Redis數據模型在智慧消防數據查詢的響應效率,較傳統的Oracle數據模型有較大的優勢,可以滿足智慧消防系統實際應用中高訪問量、高并發和計時響應的現實需求。
然而,Redis作為一個內存型數據庫,其數據存儲容量有限,需要在和大數據結合上更做進一步的研究;智慧消防的設計尚處于理論階段,最終的云平臺和模型細節仍在研究過程中,因此如何將Redis模型更好地應用于智慧消防系統的建設中,還需要更全面的研究與探索,但只要全社會共同努力,相信智慧消防很快來到我們身邊。讓我們共同期待智慧消防早日到來!
[1]丁宏軍.基于物聯網技術的智慧消防建設[J].消防技術與產品信息,2017.
[2]嚴霄鳳,張德馨.大數據研究[J].計算機技術與發展, 2013.
[3] Redis [EB/OL]. 2016-01-28. http: //redis.io.
[4]Key-Value stores: A practical overview[EB/OL].
[2013-07-25].http://blog.marc-seeger.de/assets/papers/Ul-tra_Large_Sites_SS09-Seeger_Key_Value_Stores.pdf.
[5]How fast is Redis[EB/OL]. 2013-08-20.http: //redis. io/topics/benchmarks.
[6]朱明倫,胡金初.Linux下基于B/S的高并發Web服務優化研究[J].計算機技術與發展,2006.
[7]王珊,肖艷芹,劉大為等.內存數據庫關鍵技術研究[J].計算機應用,2007.
[8]丁祥郭.“智慧消防”建設與發展的思考[J].計算機安全, 2012.
[9]張景云.基于Redis的矢量數據組織研究[D].南京:南京師范大學,2013.
[10]曹盛華.關于“智慧消防”建設與發展的探討[J].數字化用戶,2017.
[11]丁曉春.云計算與上海市智慧消防[J].現代測繪,2013.
[12]葛儉輝.物聯網技術在“智慧消防”建設中的應用初探[C].消防科技與經濟發展—2014年浙江省消防學術論文優秀獎論文集,2015.