本申請(qǐng)實(shí)施例涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)傳遞方法。本申請(qǐng)實(shí)施例同時(shí)還涉及一種數(shù)據(jù)傳遞設(shè)備。
背景技術(shù):
在現(xiàn)有技術(shù)中,需要將采集到的數(shù)據(jù),回傳給監(jiān)控設(shè)備;而在具體的回傳過程中,需要在對(duì)系統(tǒng)資源的消耗要盡可能的小,以便減小對(duì)采集的性能監(jiān)控?cái)?shù)據(jù)準(zhǔn)確性的影響。
而在目前的回傳方案中,有以下幾種方式:
方式一、單線程回傳,也即在采集得到數(shù)據(jù)后,立馬將數(shù)據(jù)回傳給監(jiān)控設(shè)備,而不對(duì)數(shù)據(jù)進(jìn)行保存;這種方式會(huì)頻繁調(diào)用回傳程序,產(chǎn)生系統(tǒng)開銷,從而影響數(shù)據(jù)準(zhǔn)確性;使得無法保證數(shù)據(jù)的完整性,且一旦一次回傳失敗后,該數(shù)據(jù)就會(huì)丟失,無法重試。
方式二、通過日志文件方式回傳,也即先將采集到的監(jiān)控?cái)?shù)據(jù),打印到一個(gè)日志文件中,日志文件保存在用戶的機(jī)器上;同時(shí)再啟動(dòng)一個(gè)進(jìn)程,用以異步地逐行掃描該日志文件,每讀取一行日志文件數(shù)據(jù),就將讀取到的日志文件數(shù)據(jù)回傳給監(jiān)控設(shè)備;在這種方式中,會(huì)造成頻繁的IO(Input/Output,輸入/輸出)操作,會(huì)占用大量的系統(tǒng)IO資源,同時(shí)在IO操作過程中,也會(huì)對(duì)CPU(Central Processing Unit,中央處理器)等指標(biāo)產(chǎn)生影響,同樣會(huì)造成數(shù)據(jù)的不準(zhǔn)確。
方式三、通過數(shù)組或鏈表的方式回傳,也即將采集到的數(shù)據(jù)先存放在一個(gè)數(shù)組或鏈表中,同時(shí)再啟動(dòng)一個(gè)進(jìn)程B,定時(shí)從數(shù)組或鏈表中獲取數(shù)據(jù),并將獲取到的數(shù)據(jù)回傳給監(jiān)控設(shè)備;但是數(shù)組和鏈表線程不安全,在多線程 的情況下,容易出現(xiàn)問題;其次,數(shù)組和鏈表在取出數(shù)據(jù)后,需要將數(shù)組或鏈表中的這個(gè)數(shù)據(jù)刪除,刪除過程需要對(duì)整個(gè)數(shù)組或鏈表的數(shù)據(jù)進(jìn)行移動(dòng),數(shù)據(jù)量大的話,會(huì)造成系統(tǒng)開銷,影響采集數(shù)據(jù)的準(zhǔn)確性;而頻繁的節(jié)點(diǎn)操作,會(huì)引起頻繁的申請(qǐng)和釋放內(nèi)存操作,造成系統(tǒng)開銷;且如果消費(fèi)數(shù)據(jù)的進(jìn)程出現(xiàn)問題,導(dǎo)致數(shù)據(jù)無法及時(shí)被使用掉,會(huì)導(dǎo)致數(shù)組或鏈表中的數(shù)據(jù)堆積,時(shí)間長(zhǎng)了容易引起內(nèi)存溢出的問題。
可見現(xiàn)有的回傳方式都無法滿足在回傳時(shí)對(duì)系統(tǒng)資源的消耗要盡可能的小,以及減小對(duì)采集的性能監(jiān)控?cái)?shù)據(jù)準(zhǔn)確性的影響的需要。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中無法滿足在回傳時(shí)對(duì)系統(tǒng)資源的消耗要盡可能小的要求,以及面臨無法減小對(duì)采集的性能監(jiān)控?cái)?shù)據(jù)準(zhǔn)確性的影響的缺陷,本申請(qǐng)?zhí)岢隽艘环N數(shù)據(jù)傳遞方法,包括:
將采集到的數(shù)據(jù)存入循環(huán)數(shù)組;
從所述循環(huán)數(shù)組中提取數(shù)據(jù);
將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備。
可選的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述將采集到的數(shù)據(jù)存入循環(huán)數(shù)組,具體包括:
將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū)域中。
可選的,所述循環(huán)數(shù)組中包括頭指針和尾指針,所述頭指針和所述尾指針分別對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)與所述頭指針的值相同;所述尾指針對(duì)應(yīng)的區(qū)域的編號(hào)和所述尾指針的值相同;
所述將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū)域中,具體包括:
將采集到的數(shù)據(jù)存入所述循環(huán)數(shù)組中所述尾指針對(duì)應(yīng)的區(qū)域;
判斷所述循環(huán)數(shù)組的各區(qū)域是否已滿,且頭指針與尾指針是否對(duì)應(yīng)于同一個(gè)區(qū)域;
若判斷結(jié)果都為是,則將頭指針的值預(yù)加1;
若判斷結(jié)果為否,則將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值加1;
將尾指針的值預(yù)加1;
判斷當(dāng)前的頭指針或尾指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出所述循環(huán)數(shù)組;
若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述頭指針的值,并將所述頭指針的值歸零;若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的頭指針的值為所述頭指針的值;
若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述尾指針的值,并將所述尾指針的值歸零;若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的尾指針的值為尾指針的值。
可選的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述從所述循環(huán)數(shù)組中提取數(shù)據(jù),具體包括:
按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù)。
可選的,所述循環(huán)數(shù)組中包括頭指針,所述頭指針對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)所述頭指針的值相同;
所述按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù),具體包括;
判斷所述循環(huán)數(shù)組中是否存儲(chǔ)有數(shù)據(jù);
若判斷結(jié)果為是,則從所述循環(huán)數(shù)組中所述頭指針?biāo)鶎?duì)應(yīng)的區(qū)域提取數(shù)據(jù);
將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值減1;
將頭指針的值預(yù)加1;
判斷當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出了所述循環(huán)數(shù)組;
若判斷結(jié)果為是,則取消預(yù)加1后的頭指針的值,并將頭指針的值歸零;
若判斷結(jié)果為否,則保留預(yù)加1后的頭指針的值為頭指針的值。
可選的,所述將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備,具體包括:
將提取的數(shù)據(jù)通過HTTP的方式回傳給數(shù)據(jù)接收設(shè)備。
可選的,在將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備之后,還包括:
將所述數(shù)據(jù)接收設(shè)備接收到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
本申請(qǐng)還提出了一種數(shù)據(jù)傳遞設(shè)備,包括:
存入模塊,用于將采集到的數(shù)據(jù)存入循環(huán)數(shù)組;
提取模塊,用于從所述循環(huán)數(shù)組中提取數(shù)據(jù);
回傳模塊,用于將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備。
可選的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述存入模塊,具體用于:
將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū)域中。
可選的,所述循環(huán)數(shù)組中包括頭指針和尾指針,所述頭指針和所述尾指針分別對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)與所述頭指針的值相同;所述尾指針對(duì)應(yīng)的區(qū)域的編號(hào)和所述尾指針的值相同;
所述存入模塊,具體用于:
將采集到的數(shù)據(jù)存入所述循環(huán)數(shù)組中所述尾指針對(duì)應(yīng)的區(qū)域;
判斷所述循環(huán)數(shù)組的各區(qū)域是否已滿,且頭指針與尾指針是否對(duì)應(yīng)于同一個(gè)區(qū)域;
若判斷結(jié)果都為是,則將頭指針的值預(yù)加1;
若判斷結(jié)果為否,則將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值加1;
將尾指針的值預(yù)加1;
判斷當(dāng)前的頭指針或尾指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出所述循環(huán)數(shù)組;
若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述頭指針的值,并將所述頭指針的值歸零;若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則將預(yù)加1后的頭指針的值設(shè)置為所述頭指針的值;
若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述尾指針的值,并將所述尾指針的值歸零;若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則將預(yù)加1后的尾指針的值設(shè)置為尾指針的值。
可選的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述提取模塊,具體用于:
按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù)。
可選的,所述循環(huán)數(shù)組中包括頭指針,所述頭指針對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)所述頭指針的值相同;
所述提取模塊,具體用于;
判斷所述循環(huán)數(shù)組中是否存儲(chǔ)有數(shù)據(jù);
若判斷結(jié)果為是,則從所述循環(huán)數(shù)組中所述頭指針?biāo)鶎?duì)應(yīng)的區(qū)域提取數(shù)據(jù);
將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值減1;
將頭指針的值預(yù)加1;
判斷當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出了所述循環(huán)數(shù)組;
若判斷結(jié)果為是,則取消預(yù)加1后的頭指針的值,并將頭指針的值歸零。
可選的,所述回傳模塊,具體用于:
將提取的數(shù)據(jù)通過HTTP的方式回傳給數(shù)據(jù)接收設(shè)備。
可選的,該設(shè)備包括:
存儲(chǔ)模塊,用于將所述數(shù)據(jù)接收設(shè)備接收到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
與現(xiàn)有技術(shù)相比,本申請(qǐng)中通過將采集到的數(shù)據(jù)存入循環(huán)數(shù)組;從所述循環(huán)數(shù)組中提取數(shù)據(jù);將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備;也即通過循環(huán)數(shù)組來完成了數(shù)據(jù)的回傳,通過循環(huán)數(shù)組,使得數(shù)據(jù)在回傳過程中,系統(tǒng)資源開銷小,對(duì)監(jiān)控?cái)?shù)據(jù)影響小,從而使得監(jiān)控?cái)?shù)據(jù)更準(zhǔn)確;而在數(shù)據(jù)的獲取以及存入的不同線程是異步的,也即線程間沒有鎖的競(jìng)爭(zhēng),進(jìn)一步減少了系統(tǒng)開銷;此外,循環(huán)數(shù)組是事先申請(qǐng)的一塊連續(xù)內(nèi)存區(qū)域,后續(xù)不需要頻繁地申請(qǐng)和釋放內(nèi)存,減少申請(qǐng)和釋放內(nèi)存的開銷。
附圖說明
圖1為本申請(qǐng)實(shí)施例提出的一種數(shù)據(jù)傳遞方法的流程示意圖;
圖2為本申請(qǐng)實(shí)施例提出的一種循環(huán)數(shù)組的示意圖;
圖3為本申請(qǐng)實(shí)施例提出的一種數(shù)據(jù)存儲(chǔ)方法的流程示意圖;
圖4為本申請(qǐng)實(shí)施例提出的一種數(shù)據(jù)提取方法的流程示意圖;
圖5為本申請(qǐng)實(shí)施例提出的一種數(shù)據(jù)傳遞設(shè)備的結(jié)構(gòu)示意圖。
具體實(shí)施方式
如背景技術(shù)所述,現(xiàn)有技術(shù)中的回傳方案都無法滿足對(duì)系統(tǒng)資源的消耗要盡可能的小,以及減小對(duì)采集的性能監(jiān)控?cái)?shù)據(jù)準(zhǔn)確性的影響的要求,為此,本申請(qǐng)公開了一種數(shù)據(jù)傳遞方法,應(yīng)用于監(jiān)控系統(tǒng)中(監(jiān)控系統(tǒng)要求系統(tǒng)資源消耗盡可能低),用以在數(shù)據(jù)回傳的過程中,實(shí)現(xiàn)比現(xiàn)有技術(shù)中耕地的資源消耗,從而有效減小了對(duì)采集的性能監(jiān)控?cái)?shù)據(jù)準(zhǔn)確性的影響,該方法如圖1 所示,包括以下步驟:
步驟101、將采集到的數(shù)據(jù)存入循環(huán)數(shù)組。
具體的,循環(huán)數(shù)組如圖2所示,是一個(gè)循環(huán)連續(xù)的數(shù)組,循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量的用于存儲(chǔ)數(shù)據(jù)的區(qū)域,各所述區(qū)域之間存在先后順序關(guān)系;其中各個(gè)區(qū)域用以零開頭的連續(xù)的數(shù)字進(jìn)行標(biāo)識(shí),從0開始,例如若有7個(gè)區(qū)域,則分別標(biāo)識(shí)為0、1、2、3、4、5、6;以此,具體的將采集到的數(shù)據(jù)存入循環(huán)數(shù)組,包括:將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū)域中。
更具體的,所述循環(huán)數(shù)組中包括頭指針和尾指針,所述頭指針和所述尾指針分別對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)與所述頭指針的值相同;所述尾指針對(duì)應(yīng)的區(qū)域的編號(hào)與所述尾指針的值相同;例如若頭指針或尾指針的值為1,則對(duì)應(yīng)的區(qū)域的標(biāo)識(shí)數(shù)字也為1;以此具體的將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū)域中,具體包括:
將采集到的數(shù)據(jù)存入所述循環(huán)數(shù)組中所述尾指針對(duì)應(yīng)的區(qū)域;
判斷所述循環(huán)數(shù)組的各區(qū)域是否已滿,且頭指針與尾指針是否對(duì)應(yīng)于同一個(gè)區(qū)域;
若判斷結(jié)果都為是,則將頭指針的值預(yù)加1;
若判斷結(jié)果為否,則將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值加1;
將尾指針的值預(yù)加1;
判斷當(dāng)前的頭指針或尾指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出所述循環(huán)數(shù)組;
若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述頭指針的值,并將所述頭指針的值歸零;若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的頭指針的值為所述頭指針的值;
若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所 述尾指針的值,并將所述尾指針的值歸零;若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的尾指針的值為尾指針的值。
事實(shí)上,循環(huán)數(shù)組實(shí)質(zhì)是一個(gè)一定長(zhǎng)度的數(shù)組,本申請(qǐng)中通過設(shè)置使其可以實(shí)現(xiàn)循環(huán),從而變成循環(huán)數(shù)組,具體的在存儲(chǔ)數(shù)據(jù)的過程中,其過程如圖3所示,首先將數(shù)據(jù)存入尾指針(也即indexEnd)對(duì)應(yīng)的區(qū)域,存完后,會(huì)判斷循環(huán)數(shù)組中的各個(gè)區(qū)域是否滿了(也即存儲(chǔ)的數(shù)據(jù)的數(shù)量是否等于區(qū)域的數(shù)量),為了防止多線程引起的線程安全問題,這里還需要再判斷下頭尾指針是否在同一個(gè)位置(也即判斷頭指針indexHead的值是否等于indexEnd的值),因?yàn)檠h(huán)數(shù)組滿了的時(shí)候,頭尾指針必定是在同一個(gè)位置的(此時(shí)兩個(gè)指針正好相差一圈的距離),如果頭尾指針不在同一個(gè)位置,說明有多個(gè)線程在操作這個(gè)數(shù)組,這時(shí)候,為了防止線程安全問題,就不能對(duì)頭指針進(jìn)行操作。
如果循環(huán)數(shù)組中的各個(gè)區(qū)域滿了,且頭尾指針在同一個(gè)位置,則頭指針的值預(yù)加1,例如原本為6,預(yù)加1后,變?yōu)?,也即頭指針對(duì)應(yīng)的區(qū)域向右移動(dòng)一個(gè)區(qū)域(當(dāng)然也可以設(shè)置為向左移動(dòng)一個(gè)區(qū)域,例如循環(huán)數(shù)組的個(gè)區(qū)域是以反序的方式來標(biāo)識(shí)的),溢出了循環(huán)數(shù)組,此時(shí),取消對(duì)頭指針的進(jìn)行預(yù)加1后的值,設(shè)置頭指針的值為0,這樣,新數(shù)據(jù)覆蓋隊(duì)列最前面的一個(gè)數(shù)據(jù),數(shù)據(jù)總數(shù)沒有變,所以存儲(chǔ)的數(shù)據(jù)的數(shù)量size不用加1;若循環(huán)數(shù)組的各區(qū)域未滿,則將存儲(chǔ)的數(shù)據(jù)的數(shù)量加1,即size加1;而在頭指針或者尾指針在變化后,需要判斷下其是否溢出了數(shù)組,溢出的指針的值取消預(yù)加1后的值,直接被賦值為0;若沒有溢出,則保留預(yù)加1后的值為指針的值。
存入數(shù)據(jù),也即步驟101是一個(gè)線程,此外還存在一個(gè)異步的操作,也即進(jìn)行數(shù)據(jù)提取,也即進(jìn)行步驟102。
步驟102、從循環(huán)數(shù)組中提取數(shù)據(jù)。
具體的,循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量的用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū) 域之間存在先后順序關(guān)系;以此,所述從所述循環(huán)數(shù)組中提取數(shù)據(jù),具體包括:
按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù)。
而更具體的,所述循環(huán)數(shù)組中包括頭指針,所述頭指針對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)所述頭指針的值相同;
所述按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù),具體包括;
判斷所述循環(huán)數(shù)組中是否存儲(chǔ)有數(shù)據(jù);
若判斷結(jié)果為是,則從所述循環(huán)數(shù)組中所述頭指針?biāo)鶎?duì)應(yīng)的區(qū)域提取數(shù)據(jù);
將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值減1;
將頭指針的值預(yù)加1;
判斷當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出了所述循環(huán)數(shù)組;
若判斷結(jié)果為是,則取消預(yù)加1后的頭指針的值,并將頭指針的值歸零;
若判斷結(jié)果為否,則保留預(yù)加1后的頭指針的值為頭指針的值。
具體的數(shù)據(jù)提取過程如圖4所示,首先判斷size是否大于0,也即判斷循環(huán)數(shù)組中是否存儲(chǔ)有數(shù)據(jù),但確定存儲(chǔ)有數(shù)據(jù)時(shí),則從頭指針(indexHead)對(duì)應(yīng)的區(qū)域提取數(shù)據(jù);將數(shù)據(jù)提取出來后,將size減1,也即將循環(huán)數(shù)組中存儲(chǔ)的數(shù)據(jù)的數(shù)量減1,然后頭指針的值預(yù)加1,也即頭指針對(duì)應(yīng)的區(qū)域向右移動(dòng)一個(gè)區(qū)域,當(dāng)然也可以是向左移動(dòng)一個(gè)區(qū)域,具體的可以設(shè)置,只要保證頭指針和尾指針的值變化后,相同的變化移動(dòng)的是相同的區(qū)域即可,并判斷加1后的頭指針的值是否溢出了循環(huán)數(shù)組,而具體的可以使用&位運(yùn)算來完成破判斷的過程,規(guī)定循環(huán)數(shù)組的大小為2的指數(shù)倍,用QUEUE_SIZE來表示,指針用index表示。那么移動(dòng)后,指針的位置就是(index+1)&(QUEUE_SIZE-1);直接使用位運(yùn)算就可以得到,避免了if判斷操 作、加減法操作和取余操作,運(yùn)算起來更快,系統(tǒng)資源開銷更小,例如當(dāng)預(yù)加1后的頭指針的值為7,但標(biāo)識(shí)循環(huán)數(shù)組中區(qū)域的最大的數(shù)字為6,由于7>6,則可以確定溢出了,在此情況下,直接將頭指針的值歸零,也即將頭指針對(duì)應(yīng)的區(qū)域設(shè)置為循環(huán)數(shù)組中被標(biāo)識(shí)為0的區(qū)域,也即順序上的第一個(gè)區(qū)域;若沒有溢出,則保留預(yù)加1后的值(例如為7)作為頭指針的值,并結(jié)束操作。
前述的步驟101和步驟102只是基于描述的需要設(shè)置的標(biāo)號(hào),并不具有順序的含義,事實(shí)上,這兩個(gè)步驟屬于異步的操作,且互相是不會(huì)干擾的,也即在執(zhí)行步驟101的同時(shí),是可以同時(shí)執(zhí)行步驟102的。
步驟103、將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備。
具體的回傳過程,可以包括:
將提取的數(shù)據(jù)通過HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)的方式回傳給數(shù)據(jù)接收設(shè)備;當(dāng)然除此以外,還可以有很多別的方式來實(shí)現(xiàn)回傳,只要能實(shí)現(xiàn)數(shù)據(jù)的準(zhǔn)確有效地傳遞即可,并不限于HTTP這一種方式。
而在將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備之后,還包括:
將所述數(shù)據(jù)接收設(shè)備接收到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
為了對(duì)本申請(qǐng)進(jìn)行進(jìn)一步的說明,本申請(qǐng)還公開了一種數(shù)據(jù)傳遞設(shè)備,如圖5所示,包括:
存入模塊501,用于將采集到的數(shù)據(jù)存入循環(huán)數(shù)組;
提取模塊502,用于從所述循環(huán)數(shù)組中提取數(shù)據(jù);
回傳模塊503,用于將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備。
具體的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述存入模塊501,具體用于:
將采集到的數(shù)據(jù)按照所述區(qū)域的先后順序依次存儲(chǔ)在所述循環(huán)數(shù)組的區(qū) 域中。
所述循環(huán)數(shù)組中包括頭指針和尾指針,所述頭指針和所述尾指針分別對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針和所述尾指針分別對(duì)應(yīng)的區(qū)域的編號(hào)分別與所述頭指針和所述尾指針的值相同;
所述存入模塊501,具體用于:
將采集到的數(shù)據(jù)存入所述循環(huán)數(shù)組中所述尾指針對(duì)應(yīng)的區(qū)域;
判斷所述循環(huán)數(shù)組的各區(qū)域是否已滿,且頭指針與尾指針是否對(duì)應(yīng)于同一個(gè)區(qū)域;
若判斷結(jié)果都為是,則將頭指針的值預(yù)加1;
若判斷結(jié)果為否,則將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值加1;
將尾指針的值預(yù)加1;
判斷當(dāng)前的頭指針或尾指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出所述循環(huán)數(shù)組;
若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述頭指針的值,并將所述頭指針的值歸零;若當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的頭指針的值為所述頭指針的值;
若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域溢出所述循環(huán)數(shù)組,則取消預(yù)加1后的所述尾指針的值,并將所述尾指針的值歸零;若當(dāng)前的尾指針?biāo)鶎?duì)應(yīng)的區(qū)域沒有溢出所述循環(huán)數(shù)組,則保留預(yù)加1后的尾指針的值為尾指針的值。
具體的,所述循環(huán)數(shù)組中包含有預(yù)設(shè)數(shù)量用于存儲(chǔ)數(shù)據(jù)的區(qū)域;各所述區(qū)域之間存在先后順序關(guān)系;
所述提取模塊502,具體用于:
按照所述先后順序關(guān)系依次從所述循環(huán)數(shù)組的區(qū)域中提取數(shù)據(jù)。
所述循環(huán)數(shù)組中包括頭指針,所述頭指針對(duì)應(yīng)所述循環(huán)數(shù)組中一個(gè)區(qū)域;所述頭指針對(duì)應(yīng)的區(qū)域的編號(hào)所述頭指針的值相同;
所述提取模塊502,具體用于;
判斷所述循環(huán)數(shù)組中是否存儲(chǔ)有數(shù)據(jù);
若判斷結(jié)果為是,則從所述循環(huán)數(shù)組中所述頭指針?biāo)鶎?duì)應(yīng)的區(qū)域提取數(shù)據(jù);
將表示所述循環(huán)數(shù)組中數(shù)據(jù)的數(shù)量的數(shù)值減1;
將頭指針的值預(yù)加1;
判斷當(dāng)前的頭指針?biāo)鶎?duì)應(yīng)的區(qū)域是否溢出了所述循環(huán)數(shù)組;
若判斷結(jié)果為是,則取消預(yù)加1后的頭指針的值,并將頭指針的值歸零;
若判斷結(jié)果為否,則保留預(yù)加1后的頭指針的值為頭指針的值。
具體的,所述回傳模塊503,具體用于:
將提取的數(shù)據(jù)通過HTTP的方式回傳給數(shù)據(jù)接收設(shè)備。
具體的,該設(shè)備,還包括:
存儲(chǔ)模塊,用于將所述數(shù)據(jù)接收設(shè)備接收到的數(shù)據(jù)存入數(shù)據(jù)庫(kù)中。
與現(xiàn)有技術(shù)相比,本申請(qǐng)中通過將采集到的數(shù)據(jù)存入循環(huán)數(shù)組;從所述循環(huán)數(shù)組中提取數(shù)據(jù);將提取的數(shù)據(jù)回傳給數(shù)據(jù)接收設(shè)備;也即通過循環(huán)數(shù)組來完成了數(shù)據(jù)的回傳,通過循環(huán)數(shù)組,使得數(shù)據(jù)在回傳過程中,系統(tǒng)資源開銷小,對(duì)監(jiān)控?cái)?shù)據(jù)影響小,從而使得監(jiān)控?cái)?shù)據(jù)更準(zhǔn)確;而在數(shù)據(jù)的獲取以及存入的不同線程是異步的,也即線程間沒有鎖的競(jìng)爭(zhēng),進(jìn)一步減少了系統(tǒng)開銷;此外,循環(huán)數(shù)組是事先申請(qǐng)的一塊連續(xù)內(nèi)存區(qū)域,后續(xù)不需要頻繁地申請(qǐng)和釋放內(nèi)存,減少申請(qǐng)和釋放內(nèi)存的開銷。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請(qǐng)可以通過硬件實(shí)現(xiàn),也可以借助軟件加必要的通用硬件平臺(tái)的方式來實(shí)現(xiàn)。基于這樣的理解,本申請(qǐng)的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來,該軟件產(chǎn)品可以存儲(chǔ)在一個(gè)非易失性存儲(chǔ)介質(zhì)(可以是CD-ROM,U盤,移動(dòng)硬盤等)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服 務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施場(chǎng)景所述的方法。
本領(lǐng)域技術(shù)人員可以理解附圖只是一個(gè)優(yōu)選實(shí)施場(chǎng)景的示意圖,附圖中的模塊或流程并不一定是實(shí)施本申請(qǐng)所必須的。
本領(lǐng)域技術(shù)人員可以理解實(shí)施場(chǎng)景中的裝置中的模塊可以按照實(shí)施場(chǎng)景描述進(jìn)行分布于實(shí)施場(chǎng)景的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施場(chǎng)景的一個(gè)或多個(gè)裝置中。上述實(shí)施場(chǎng)景的模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。
上述本申請(qǐng)序號(hào)僅僅為了描述,不代表實(shí)施場(chǎng)景的優(yōu)劣。
以上公開的僅為本申請(qǐng)的幾個(gè)具體實(shí)施場(chǎng)景,但是,本申請(qǐng)并非局限于此,任何本領(lǐng)域的技術(shù)人員能思之的變化都應(yīng)落入本申請(qǐng)的保護(hù)范圍。