對於實時較大數據量的緩存管理上,設計的方式有不少。在此提出一種初步的、較粗略的思路,僅供參考。背景:系統分爲三層,數據採集層(採集底層的數據),消息管理層(對採集上來的數據進行處理)、消息接口層(對消息解析封裝、處理客戶端的Socket請求等)。數據庫
在數據的緩存管理上,採用雙緩衝區模式的管理機制。 http://vcsky.net by havenzhao緩存
雙緩衝區模式:在內存裏開闢兩塊容量相等的緩衝區(如下將分別它們稱爲第一緩衝區和第二緩衝區)做爲連續數據輸入的緩衝區。工做開始時,採集到消息管理層的數據先寫入第一緩衝區中,在第一緩衝區寫滿後,再寫入第二緩衝區,當把數據寫入第二緩衝區的同時,數據處理線程根據自身須要取出第一緩衝區中的數據作特定的處理,例如存文件,存儲完畢後,將緩衝清空,等待再次被寫入。當第二緩衝區被寫滿後,再回到第一緩衝區,把新數據寫入第一緩衝區中;與此同時數據處理線程取出第二緩衝區中的數據。整個數據緩存處理過程能夠如此不斷地循環進行下去。ide
緩衝區的大小,能夠從XML配置文件中設置,設置方式有兩種,一種爲大小模式,一種爲時間間隔模式。採用設置大小的模式後,數據寫入緩衝的斷定準則爲是否到達指定的緩衝區最大容量,若是到了,就開始寫入另外一個緩衝區。採用時間間隔的模式的話,則以設置的時間間隔爲準則,來切換寫入的兩個緩衝區。從而實現兩個緩衝區的交替進行,確保數據無丟失。大數據
當一條採集數據從採集層傳到消息管理層時,首先查找設備主題,若是存在此設備ID,則設置相應的設備主題的數據,而後進入當前工做的緩衝區,增長此條數據,而後,分發給訂閱此設備的全部用戶,最後,將此數據記錄插入到levelDB數據庫中。.net
消息分發到消息接口層時,接口層將此條消息解析成XML格式,加上消息頭,發送給訂閱用戶。消息頭中,有一項重要的編號sn,做爲一次發送消息包的惟一編號標示。發送成功後,記錄此sn到sn的集合中。接口層等待客戶端反饋的消息,若是客戶反饋回消息來了,則提取返回的sn編號,在sn集合中進行查找,若是查找成功,那麼,刪除此sn集合中的記錄,此條數據已經完整的處理成功了。每隔5分鐘,或者其它時間段(這個時間間隔,能夠在系統XML文件中設定),檢查sn集合。若是sn集合中有存在的sn記錄,則視爲發送不成功的消息記錄,此時再次從新發送。從新發送時,須要根據設備id與時間戳做爲key,從levelDB中去查找對應到的value,即數據,再結合用戶id,造成發送消息,從而發送給對應的客戶端。線程
sn集合包含:sn編號、用戶id、設備id、時間戳。設計
數據緩存插入levelDB存儲系統時,以device_id + time_stamp 爲key值,確保key值惟一,data爲value。blog
插入關係數據庫的話,採用分區表的機制,便於數據量過大時,提高查詢效率。接口
如下爲三個流程圖:內存
http:vcsky.net by havenzhao