詹利群,程海林,任曉煒
1(廣西壯族自治區(qū)氣象信息中心,南寧 530022)
2(成都信息工程大學(xué),成都 610225)
2016年12月,全國(guó)綜合氣象信息共享平臺(tái)(簡(jiǎn)稱(chēng)CIMISS)在25個(gè)省份正式開(kāi)始業(yè)務(wù)化運(yùn)行,全國(guó)氣象部門(mén)初步建立了基于CIMISS的國(guó)省一致的氣象數(shù)據(jù)數(shù)據(jù)環(huán)境,各省統(tǒng)一了數(shù)據(jù)的來(lái)源、標(biāo)準(zhǔn)、流程和服務(wù)[1,2],形成了良好的業(yè)務(wù)應(yīng)用生態(tài).廣西壯族自治區(qū)氣象局圍繞CIMISS 統(tǒng)一數(shù)據(jù)環(huán)境開(kāi)展核心業(yè)務(wù)系統(tǒng)的集約整合和流程再造,截至2017年底已有26個(gè)核心業(yè)務(wù)系統(tǒng)成功對(duì)接CIMISS.隨著越來(lái)越多核心業(yè)務(wù)系統(tǒng)的對(duì)接,CIMISS 成為一個(gè)數(shù)據(jù)訪問(wèn)效率的瓶頸,所有對(duì)接的核心業(yè)務(wù)系統(tǒng)的數(shù)據(jù)源調(diào)用都是通過(guò)氣象數(shù)據(jù)統(tǒng)一服務(wù)接口(簡(jiǎn)稱(chēng)MUSIC)[3,4]調(diào)用CIMISS 數(shù)據(jù).MUSIC 面向氣象業(yè)務(wù)和科研,提供全國(guó)統(tǒng)一、標(biāo)準(zhǔn)、豐富的數(shù)據(jù)訪問(wèn)服務(wù)和應(yīng)用編程接口(API),為國(guó)、省、地、縣各級(jí)應(yīng)用系統(tǒng)提供唯一權(quán)威的數(shù)據(jù)接入服務(wù).據(jù)2017年接口應(yīng)用統(tǒng)計(jì)分析,用戶(hù)平均每天訪問(wèn)接口的次數(shù)達(dá)到35 萬(wàn)次以上,實(shí)時(shí)并發(fā)數(shù)平均達(dá)到每秒50 次以上,接口耗時(shí)<1 秒的統(tǒng)計(jì)達(dá)到97.8%以上,>1 秒以上占據(jù)2.2%以上.在這些資料中,逐小時(shí)自動(dòng)氣象站資料具有空間分辨率高、時(shí)間間隔短的特點(diǎn),一直是氣象業(yè)務(wù)應(yīng)用中用到最多的幾種資料之一[5],對(duì)于開(kāi)展預(yù)報(bào)預(yù)測(cè)、決策服務(wù)、災(zāi)害預(yù)警等氣象業(yè)務(wù)意義重大[6],用戶(hù)對(duì)該類(lèi)數(shù)據(jù)的檢索效率提出了越來(lái)越高的要求.傳統(tǒng)的直接從數(shù)據(jù)庫(kù)查詢(xún)數(shù)據(jù)已經(jīng)滿(mǎn)足不了需求,我們迫切需要找出一種高效查詢(xún)逐小時(shí)自動(dòng)氣象站數(shù)據(jù)的方法,以提高用戶(hù)服務(wù)效率.
Redis 是一種基于內(nèi)存運(yùn)行并支持持久化的NoSQL數(shù)據(jù)庫(kù),主要解決關(guān)系型數(shù)據(jù)庫(kù)高并發(fā)情況下數(shù)據(jù)處理時(shí)效問(wèn)題.因?yàn)槭羌儍?nèi)存操作,Redis 讀寫(xiě)性能非常出色,每秒可以處理超過(guò)10 萬(wàn)次的讀寫(xiě)操作[7].
Redis 是開(kāi)源的高性能Key-Value 存儲(chǔ)引擎,提供多種數(shù)據(jù)結(jié)構(gòu).Redis 可以用作緩存,也可以用作存儲(chǔ)[8].支持字符串、鏈表、集合、哈希等多種數(shù)據(jù)結(jié)構(gòu)以及豐富的編程語(yǔ)言,還可將緩存數(shù)據(jù)持久化,對(duì)數(shù)據(jù)的更新將異步保存到磁盤(pán)上,除此之外,也實(shí)現(xiàn)了masterslave(主從)同步,提供集群操作.
1)性能極高
Redis 直接在內(nèi)存中進(jìn)行讀取及寫(xiě)入,他的速度非常的快.讀取速度是110 000 次/s,寫(xiě)入速度是81 000 次/s .
2)豐富的數(shù)據(jù)類(lèi)型
Redis 支持二進(jìn)制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 數(shù)據(jù)類(lèi)型操作.
3)原子性操作
Redis的所有操作都是原子性的,同時(shí)Redis 還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行.
4)具有豐富的特性
Redis 還支持 publish/subscribe,通知,key 過(guò)期等等特性.
Redis 最主要的應(yīng)用場(chǎng)景之一便是業(yè)務(wù)緩存,將一些不經(jīng)常改變但又經(jīng)常訪問(wèn)的熱點(diǎn)數(shù)據(jù)常駐在內(nèi)存中,并在內(nèi)存中完成對(duì)數(shù)據(jù)的操作[9],有效地減少數(shù)據(jù)庫(kù)讀取次數(shù),減少數(shù)據(jù)庫(kù)壓力,提高響應(yīng)時(shí)間,增強(qiáng)吞吐量.
對(duì)Redis的主要操作便是對(duì)其鍵值的存取操作,根據(jù)數(shù)據(jù)結(jié)構(gòu)的不同,提供有非常豐富的操作命令.例如,對(duì)字符串和哈希結(jié)構(gòu)的簡(jiǎn)單存取命令如下[9,10]:
1)字符串操作
存儲(chǔ)命令:SET key value
查詢(xún)命令:GET key
2)哈希(hash)操作
存儲(chǔ)命令:HSET key field value
查詢(xún)命令:HGET key field
Redis 還有設(shè)置時(shí)間過(guò)期的功能,通過(guò)EXPIRE key seconds 命令完成對(duì)鍵key的過(guò)期時(shí)間設(shè)置.
逐小時(shí)自動(dòng)氣象站資料作為氣象業(yè)務(wù)部門(mén)日常觀測(cè)的重要資料之一,也是業(yè)務(wù)應(yīng)用中用到最多的幾種資料之一.通過(guò)分析CIMISS—MUSIC 氣象數(shù)據(jù)統(tǒng)一服務(wù)接口中的資料訪問(wèn)情況,如圖1所示.
通過(guò)分析得出,中國(guó)地面逐小時(shí)資料是所有資料訪問(wèn)中訪問(wèn)次數(shù)最多的,平均每天達(dá)到10 萬(wàn)次左右,占據(jù)所有資料訪問(wèn)的三分之一左右.因此,對(duì)逐小時(shí)自動(dòng)站資料的檢索查詢(xún)效率進(jìn)行優(yōu)化提升具有非常大的必要性.
根據(jù)CIMISS 數(shù)據(jù)入庫(kù)時(shí)間分析地面自動(dòng)氣象站觀測(cè)逐小時(shí)資料的到報(bào)情況,如圖2所示.

圖1 廣西CIMISS 資料訪問(wèn)情況分析

圖2 2017年11月20日10時(shí)數(shù)據(jù)到報(bào)情況
可以發(fā)現(xiàn),98%以上地面自動(dòng)站的數(shù)據(jù)在正點(diǎn)后5 分鐘內(nèi)已到報(bào),正點(diǎn)十分后數(shù)據(jù)相對(duì)穩(wěn)定,不經(jīng)常改變,因此可在正點(diǎn)十分后將相對(duì)穩(wěn)定的數(shù)據(jù)緩存到Redis 以提升檢索效率.
為了確保Redis 緩存數(shù)據(jù)與CIMISS 數(shù)據(jù)的一致性,需要定期的將Redis 數(shù)據(jù)與CIMISS 進(jìn)行同步,但如果同步頻率設(shè)置太高,如每秒或每分鐘同步一次,則從Redis 獲取數(shù)據(jù)與從CIMISS 獲取數(shù)據(jù)無(wú)差別,對(duì)檢索效率提升不大.如果同步頻率設(shè)置太低,如每10 分鐘或每半小時(shí)同步一次,緩存中的數(shù)據(jù)與CIMISS 數(shù)據(jù)的一致性差異較大.為此,需要分析CIMISS 地面自動(dòng)氣象站觀測(cè)逐小時(shí)資料的數(shù)據(jù)更新規(guī)律,選取了廣西2017年的中國(guó)地面逐小時(shí)資料數(shù)據(jù),統(tǒng)計(jì)平均每k(k=1,2,3,…,10)分鐘更新次數(shù),結(jié)果如圖3所示.

圖3 CIMISS 平均每k 分鐘更新次數(shù)
需要選擇一個(gè)較高的同步頻率并且在這個(gè)頻率期間數(shù)據(jù)更新盡量少.根據(jù)逐小時(shí)資料數(shù)據(jù)的更新規(guī)律,可選擇每隔5 分鐘定期同步CIMISS的數(shù)據(jù),以此確保緩存數(shù)據(jù)的準(zhǔn)確性.
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)把邏輯模型映射為一系列表來(lái)實(shí)現(xiàn),而Redis 作為典型的Key-Value 數(shù)據(jù)庫(kù)沒(méi)有表的概念,需要將邏輯關(guān)系映射在Key 值中或者一系列的鍵值中[11].在CIMISS 系統(tǒng)中,逐小時(shí)自動(dòng)氣象站資料是基于Oracle 關(guān)系數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)的,其檢索接口方式主要包括有按時(shí)間、地區(qū)等.根據(jù)這些業(yè)務(wù)需求,需要對(duì)數(shù)據(jù)在Redis中的存儲(chǔ)結(jié)構(gòu)進(jìn)行策略?xún)?yōu)化設(shè)計(jì),Redis 數(shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵在于Key的設(shè)計(jì),合理的設(shè)計(jì)能夠有效提升查詢(xún)效率和節(jié)省內(nèi)存的開(kāi)銷(xiāo).因此,針對(duì)實(shí)時(shí)查詢(xún)的需求,在Redis中的地面自動(dòng)氣象站逐小時(shí)資料,只存儲(chǔ)最近1 小時(shí)的數(shù)據(jù),并通過(guò)設(shè)計(jì)業(yè)務(wù)數(shù)據(jù)庫(kù)、索引數(shù)據(jù)庫(kù)和過(guò)期時(shí)間庫(kù)以提升查詢(xún)效率和保證有效性.
業(yè)務(wù)數(shù)據(jù)是存儲(chǔ)地面自動(dòng)氣象站逐小時(shí)資料數(shù)據(jù)的庫(kù),包括站名、區(qū)站號(hào)、市、縣、經(jīng)度、維度、行政區(qū)代碼等基礎(chǔ)信息,并可動(dòng)態(tài)擴(kuò)展溫度、降水量等觀測(cè)要素值.為實(shí)現(xiàn)此功能,使用站號(hào)作為Key(固定前綴_surf1h_表示逐小時(shí)資料),使用哈希結(jié)構(gòu)作為存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu).其存儲(chǔ)結(jié)構(gòu)模型如圖4所示.

圖4 逐小時(shí)資料業(yè)務(wù)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
站名、站號(hào)等基礎(chǔ)信息作為通用的公共數(shù)據(jù),可在Redis 搭建完成后便初始化并長(zhǎng)期保存,而在業(yè)務(wù)調(diào)用中,通過(guò)哈希結(jié)構(gòu)的HSET 命令來(lái)更新要素?cái)?shù)據(jù)或動(dòng)態(tài)擴(kuò)展要素,使得業(yè)務(wù)數(shù)據(jù)庫(kù)能夠支撐存儲(chǔ)地面逐小時(shí)資料的所有要素信息.如廣西氣象自動(dòng)站有2700個(gè)站,在Redis 初始化時(shí)就可將全部自動(dòng)站采用站號(hào)Key 進(jìn)行初始化完成,每個(gè)Key中的氣象自動(dòng)站逐小時(shí)210個(gè)要素字段也可以動(dòng)態(tài)初始化完成,在數(shù)據(jù)到報(bào)后通過(guò)jedis.hset("_surf1h_"+站號(hào),"要素",value)的方式進(jìn)行添加覆蓋數(shù)據(jù),從而達(dá)到數(shù)據(jù)的快速存儲(chǔ)操作.
……
Redis>jedis.hset("_surf1h_59431","City","南寧")
Redis>jedis.hset("_surf1h_59431","Cnty","江南區(qū)")
Redis>jedis.hset("_surf1h_59431","Lat","22.7833")
Redis>jedis.hset("_surf1h_59431","Lon","108.55")
……
為了實(shí)現(xiàn)能夠快速的按照地區(qū)、站號(hào)等要素值檢索,需要建立地區(qū)、要素值與業(yè)務(wù)數(shù)據(jù)庫(kù)中Key(即站號(hào))的索引關(guān)系.檢索數(shù)據(jù)時(shí),先通過(guò)索引庫(kù)檢索到符合條件的站號(hào),以站號(hào)為Key 到業(yè)務(wù)數(shù)據(jù)庫(kù)中業(yè)務(wù)數(shù)據(jù).不同的索引方式根據(jù)不同的關(guān)系操作,采用不同的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu).在本文中,主要建立了地區(qū)-站號(hào)索引庫(kù),用于支持按地區(qū)檢索要素.
地區(qū)-站號(hào)索引庫(kù)采用哈希結(jié)構(gòu),頂級(jí)Key 命名為_(kāi)surf1h_index_area,哈希結(jié)構(gòu)的Key 使用市(縣)名,值為區(qū)站號(hào),多個(gè)使用逗號(hào)分隔,這部分?jǐn)?shù)據(jù)經(jīng)常被訪問(wèn)但幾乎不會(huì)更新,因此在搭建Redis 后即可進(jìn)行初始化并長(zhǎng)期保存.通過(guò)在初期建立_surf1h_index_area的Key,將廣西14個(gè)地市和每個(gè)地市的相對(duì)應(yīng)的區(qū)站號(hào)建立起來(lái),其存儲(chǔ)結(jié)構(gòu)如圖5所示.

圖5 逐小時(shí)資料地區(qū)-站號(hào)索引庫(kù)存儲(chǔ)結(jié)構(gòu)
為保證緩存在業(yè)務(wù)數(shù)據(jù)庫(kù)中數(shù)據(jù)與CIMISS中的數(shù)據(jù)是準(zhǔn)確一致的,可以通過(guò)設(shè)計(jì)過(guò)期時(shí)間庫(kù)來(lái)確保有效性.過(guò)期時(shí)間的設(shè)定與檢索查詢(xún)效率和數(shù)據(jù)一致性緊密相關(guān),過(guò)期時(shí)間太短,則會(huì)頻繁的查詢(xún)CIMISS,效率提升不明顯,過(guò)期時(shí)間太長(zhǎng),緩存中的數(shù)據(jù)又與CIMISS 差異較大,不適合業(yè)務(wù)應(yīng)用.Redis 本身?yè)碛性O(shè)置時(shí)間過(guò)期的功能,即對(duì)存儲(chǔ)在Redis 數(shù)據(jù)庫(kù)中的值可以設(shè)置一個(gè)過(guò)期時(shí)間.根據(jù)對(duì)2.2 自動(dòng)氣象站資料的時(shí)間特性進(jìn)行分析,在正點(diǎn)10 分時(shí)開(kāi)始將較穩(wěn)定的數(shù)據(jù)在Redis 進(jìn)行緩存,并每隔5 分與CIMISS 數(shù)據(jù)進(jìn)行一次同步,即Redis中的數(shù)據(jù)只有在5 分鐘內(nèi)是有效的,當(dāng)超出該時(shí)間后,過(guò)期時(shí)間庫(kù)中的該要素信息便會(huì)被移除,此時(shí)即表示業(yè)務(wù)數(shù)據(jù)庫(kù)該要素的數(shù)據(jù)已過(guò)期.
數(shù)據(jù)寫(xiě)入Redis 業(yè)務(wù)數(shù)據(jù)庫(kù)初期,程序員建立散列類(lèi)型,通過(guò)HSET 命令逐要素寫(xiě)入.設(shè)計(jì)過(guò)程中又通過(guò)HMSET 命令同時(shí)設(shè)置多個(gè)要素字段寫(xiě)入,程序代碼比之前簡(jiǎn)潔.另外,通過(guò)要使用Redis 集群存儲(chǔ)資料首先要初始化線程類(lèi):
new RedisTestThread("redis"+i,element,admin-Code).start()
將不同的要素、地區(qū)數(shù)據(jù)進(jìn)行初始化.在線程類(lèi)中實(shí)現(xiàn)將不同的站號(hào)進(jìn)行初始化,根據(jù)資料要素的不同站號(hào),通過(guò)jedis.hmset(key,dataMap)進(jìn)行數(shù)據(jù)設(shè)置,其中Key 為"_surf1h_"+站號(hào),dataMap 為站號(hào)下對(duì)應(yīng)的業(yè)務(wù)數(shù)據(jù).
最后設(shè)置數(shù)據(jù)過(guò)期時(shí)間jedis.expire(key,Time).
省、市、縣三級(jí)用戶(hù)對(duì)自動(dòng)氣象站逐小時(shí)數(shù)據(jù)的查詢(xún)主要通過(guò)地區(qū)行政編碼進(jìn)行分類(lèi)查詢(xún),索引庫(kù)的建立,可以通過(guò)采用地區(qū)行政編碼作為地區(qū)分類(lèi).首先建立所有地區(qū)分類(lèi)的集合,如“450000”代表全廣西,則該索引下的站號(hào)為全廣西的自動(dòng)站站號(hào),“450100”代表南寧市,則“450100”索引下存放整個(gè)南寧市的自動(dòng)站站號(hào).通過(guò)循環(huán)設(shè)置全廣西各區(qū)市縣的站號(hào)索引.在程序設(shè)計(jì)上先定義一個(gè)HashMap 用來(lái)存放行政編碼對(duì)應(yīng)的站號(hào)信息,然后通過(guò)jedis.hmset(_surf1h_index_area,map)存放業(yè)務(wù)數(shù)據(jù),jedis.expire(_surf1h_index_area,Time)設(shè)置過(guò)期時(shí)間,達(dá)到按地區(qū)行政編碼優(yōu)化索引庫(kù)提升索引查詢(xún)性能.
完成業(yè)務(wù)數(shù)據(jù)庫(kù)、索引庫(kù)及過(guò)期時(shí)間庫(kù)存儲(chǔ)設(shè)計(jì)后,開(kāi)始通過(guò)程序?qū)⒅鹦r(shí)自動(dòng)氣象站資料及相關(guān)的輔助信息存入庫(kù)中,資料查詢(xún)流程如圖6所示.

圖6 基于Redis的逐小時(shí)資料檢索查詢(xún)流程
主要包括以下三種情況:
1)請(qǐng)求時(shí)間在正點(diǎn)后十分鐘內(nèi)
根據(jù)自動(dòng)氣象站觀測(cè)規(guī)范,自動(dòng)氣象站觀測(cè)數(shù)據(jù)在正點(diǎn)觀測(cè)后,數(shù)據(jù)立即從分布在全區(qū)各個(gè)觀測(cè)站發(fā)回觀測(cè)數(shù)據(jù)文件.通常正點(diǎn)后的2-4 分鐘是地面逐小時(shí)觀測(cè)數(shù)據(jù)入庫(kù)的高峰期,在這個(gè)時(shí)間內(nèi)數(shù)據(jù)解碼入庫(kù)的更新頻度非常高,將數(shù)據(jù)緩存到Redis中沒(méi)有意義,因此這個(gè)時(shí)間內(nèi)的數(shù)據(jù)請(qǐng)求均是通過(guò)接口直接訪問(wèn)CIMISS 獲取數(shù)據(jù)并返回.
2)請(qǐng)求時(shí)間在正點(diǎn)十分后,Redis 緩存數(shù)據(jù)已過(guò)期
此時(shí)CIMISS中數(shù)據(jù)相對(duì)穩(wěn)定,但Redis中緩存數(shù)據(jù)已過(guò)期,因此需要重新訪問(wèn)CIMISS 以獲取最新有效數(shù)據(jù),獲取數(shù)據(jù)后更新業(yè)務(wù)數(shù)據(jù)庫(kù)中相應(yīng)要素的值,同時(shí)重新設(shè)置該要素的過(guò)期時(shí)間,如設(shè)置為5 分鐘,最后返回?cái)?shù)據(jù).
3)請(qǐng)求時(shí)間在正點(diǎn)十分后,Redis 緩存數(shù)據(jù)未過(guò)期
此時(shí)緩存在Redis中的數(shù)據(jù)為有效數(shù)據(jù),首先通過(guò)查詢(xún)條件,在索引庫(kù)中進(jìn)行相應(yīng)的關(guān)系查詢(xún)篩選出符合條件的站點(diǎn)數(shù)據(jù),然后通過(guò)站號(hào)從業(yè)務(wù)數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)并返回.
在程序設(shè)計(jì)上使用jedis.hget(areaIndexKey,admin-Code),根據(jù)地區(qū)行政編碼進(jìn)行數(shù)據(jù)分類(lèi)獲取站號(hào)索引,得到該地區(qū)的所有站點(diǎn),再通過(guò)循環(huán)站點(diǎn)獲取業(yè)務(wù)數(shù)據(jù):

通過(guò)上述代碼可查詢(xún)得到相應(yīng)的業(yè)務(wù)數(shù)據(jù)
1)搭建Redis 集群
使用Redis 集群不僅可以擴(kuò)大緩存數(shù)據(jù)量,也能通過(guò)主從復(fù)制機(jī)制避免單節(jié)點(diǎn)故障導(dǎo)致無(wú)法繼續(xù)工作.在本文中,搭建3 臺(tái)服務(wù)器6個(gè)節(jié)點(diǎn)的Redis 集群,部署環(huán)境如表1所示.

表1 Redis 集群配置
2)建立模擬訪問(wèn)
使用Jedis(Redis的Java 版本的客戶(hù)端實(shí)現(xiàn))實(shí)現(xiàn)對(duì)Redis 集群的操作[12],編寫(xiě)Java 程序執(zhí)行訪問(wèn)請(qǐng)求,使用多線程等技術(shù),模擬實(shí)現(xiàn)對(duì)CIMISS 以及對(duì)Redis的檢索查詢(xún)操作.
選取地面中中國(guó)地面逐小時(shí)資料進(jìn)行試驗(yàn)分析,并選取了2018年11月26~30日每天上午7-10時(shí)和下午17-22時(shí)(業(yè)務(wù)高峰期)對(duì)實(shí)時(shí)數(shù)據(jù)(1 小時(shí)內(nèi))進(jìn)行緩存.資料包括站號(hào)、站名、溫度、降水等210個(gè)要素,如表2所示.

表2 中國(guó)地面逐小時(shí)資料數(shù)據(jù)結(jié)構(gòu)
為實(shí)現(xiàn)對(duì)基于Redis的逐小時(shí)自動(dòng)氣象站資料存儲(chǔ)的查詢(xún)效率進(jìn)行分析,設(shè)計(jì)兩組實(shí)驗(yàn)?zāi)M訪問(wèn)最近一小時(shí)的逐小時(shí)自動(dòng)氣象站資料,實(shí)驗(yàn)周期為2018年11月26~30日每天上午7-10時(shí)和下午17-22時(shí),訪問(wèn)頻率為每隔一分鐘進(jìn)行一次請(qǐng)求,實(shí)驗(yàn)詳細(xì)設(shè)計(jì)如表3所示.

表3 實(shí)驗(yàn)組設(shè)計(jì)
實(shí)驗(yàn)選擇檢索南寧市最近一小時(shí)降雨量為例,通過(guò)記錄每次開(kāi)始執(zhí)行訪問(wèn)至獲取到數(shù)據(jù)時(shí)的時(shí)間差(即執(zhí)行一次檢索數(shù)據(jù)的耗時(shí),時(shí)間單位為ms)作為實(shí)驗(yàn)結(jié)果.
1)查詢(xún)效率分析
因正點(diǎn)后前十分CIMISS 組合Redis 組均是直接訪問(wèn)CIMISS 接口,效率一致,不必分析.選擇在正點(diǎn)十分后模擬基于Redis 和CIMISS的數(shù)據(jù)查詢(xún),每分鐘調(diào)用一次查詢(xún),分別記錄每次查詢(xún)耗時(shí),結(jié)果如圖7所示.
可以看出,在正點(diǎn)十分后,直接從CIMISS 查詢(xún)的耗時(shí)總體在500 ms 左右,而Redis的查詢(xún)耗時(shí)大多數(shù)時(shí)候在100 ms 左右,每隔5 分鐘因需從CIMISS 進(jìn)行數(shù)據(jù)同步而耗時(shí)在500 ms 左右.從Redis 查詢(xún)平均耗時(shí)0.2 秒左右,CIMISS 組平均耗時(shí)0.5 秒左右,前者具有更高的查詢(xún)效率,是后者的兩倍以上.

圖7 基于Redis 與CIMISS 查詢(xún)耗時(shí)對(duì)比
2)數(shù)據(jù)一致性分析
緩存中的數(shù)據(jù)包括中國(guó)地面逐小時(shí)資料共210個(gè)要素,為確保數(shù)據(jù)的準(zhǔn)備,通過(guò)對(duì)比2018年11月26~30日每天上午7-10時(shí)和下午17-22時(shí)每分鐘從Redis 取出的要素值與CIMISS中的要素值,記錄值相同的要素個(gè)數(shù),實(shí)驗(yàn)期間平均結(jié)果如圖8所示.

圖8 Redis 與CIMISS 數(shù)據(jù)值相同的要素個(gè)數(shù)統(tǒng)計(jì)圖
通過(guò)分析,中國(guó)地面逐小時(shí)資料共210個(gè)要素在1 小時(shí)內(nèi)緩存數(shù)據(jù)與CIMISS 數(shù)據(jù)的一致性達(dá)到了99%以上,能確保數(shù)據(jù)的完整性,滿(mǎn)足業(yè)務(wù)應(yīng)用要求.
本文利用Redis 是開(kāi)源的高性能Key-Value 存儲(chǔ)引擎,提供多種數(shù)據(jù)結(jié)構(gòu)利用Redis 開(kāi)源高效內(nèi)存數(shù)據(jù)庫(kù)的特點(diǎn),結(jié)合地面自動(dòng)氣象站逐小時(shí)資料在實(shí)際業(yè)務(wù)中的應(yīng)用,通過(guò)Redis 數(shù)據(jù)庫(kù)結(jié)構(gòu)模型設(shè)計(jì)和優(yōu)化、并通過(guò)實(shí)驗(yàn)對(duì)Redis 提高了逐小時(shí)自動(dòng)氣象站資料的檢索效率和數(shù)據(jù)一致性進(jìn)行驗(yàn)證,為用戶(hù)在不同氣象資料查詢(xún)檢索方面提供了一套可操作的技術(shù)參考樣例.由于自動(dòng)氣象站觀測(cè)資料更正報(bào)等實(shí)際情況,可能導(dǎo)致緩存在Redis中的數(shù)據(jù)的及時(shí)性和一致性降低,這方面可以考慮采用基于消息的機(jī)制更新緩存數(shù)據(jù)或縮短緩存時(shí)間等來(lái)這個(gè)解決問(wèn)題.在氣象業(yè)務(wù)中,還存在很多對(duì)查詢(xún)要求較高的觀測(cè)資料,本文提出的逐小時(shí)地面自動(dòng)站資料數(shù)據(jù)結(jié)構(gòu)模型并通過(guò)Redis 進(jìn)行緩存能有效的提升檢索效率,并可以應(yīng)用到其它資料的檢索調(diào)用業(yè)務(wù)場(chǎng)景中,具有較好的推廣應(yīng)用價(jià)值.