王紅愛(ài),朱建生,劉文韜,閻志遠(yuǎn)
(中國(guó)鐵道科學(xué)研究院 電子計(jì)算技術(shù)研究所,北京 100081)
實(shí)現(xiàn)與時(shí)俱進(jìn)的目標(biāo),按照鐵路客票銷(xiāo)售渠道多樣化、服務(wù)手段現(xiàn)代化、運(yùn)營(yíng)管理現(xiàn)代化的發(fā)展方向,鐵路客票系統(tǒng)目前已經(jīng)成功應(yīng)用于各城際、高速鐵路上,購(gòu)票方式、支付手段多樣化,滿(mǎn)足不同消費(fèi)人員的需求。為滿(mǎn)足業(yè)務(wù)種類(lèi)的不斷膨脹、數(shù)據(jù)量的不斷增加,除了對(duì)硬件資源做升級(jí)改造外,研究有效的緩存機(jī)制,優(yōu)化軟件系統(tǒng)對(duì)提高售票速度是非常重要的研究課題。本文分析了目前客票系統(tǒng)中已在應(yīng)用的緩存策略,根據(jù)業(yè)務(wù)特點(diǎn)提出了一種適應(yīng)分布式系統(tǒng)的緩存方案。
數(shù)據(jù)緩存[1]是數(shù)據(jù)庫(kù)數(shù)據(jù)或外存中的文件數(shù)據(jù)在內(nèi)存中的臨時(shí)存儲(chǔ)對(duì)象,是應(yīng)用程序運(yùn)行到一定階段數(shù)據(jù)信息的內(nèi)存副本。在實(shí)際應(yīng)用環(huán)境中,有的數(shù)據(jù)在整個(gè)運(yùn)行階段更新頻率較低,沒(méi)有必要頻繁地讀取,應(yīng)用系統(tǒng)啟動(dòng)后一次性讀入內(nèi)存供使用即可;有的數(shù)據(jù)更新相對(duì)較頻繁,查詢(xún)時(shí)由于算法規(guī)則的復(fù)雜性導(dǎo)致響應(yīng)性能不能滿(mǎn)足實(shí)際需求,因而需要將這類(lèi)數(shù)據(jù)周期性地存入內(nèi)存,供后續(xù)操作或其他用戶(hù)直接從內(nèi)存中間接讀取使用,以減少直接讀取次數(shù),加快響應(yīng)速度。
Hibernate是一個(gè)優(yōu)秀的開(kāi)放源代碼數(shù)據(jù)持久層輕量級(jí)封裝框架,其緩存機(jī)制是大家廣為借鑒和使用的。H ibernate的緩存機(jī)制就是為了降低應(yīng)用程序?qū)υ磾?shù)據(jù)庫(kù)訪問(wèn)的頻度,進(jìn)而提高應(yīng)用程序的運(yùn)行性能[2]??蛻?hù)端提交申請(qǐng)時(shí)首先訪問(wèn)緩存,如果能夠命中,則從緩存中提出數(shù)據(jù),否則從數(shù)據(jù)庫(kù)中提出數(shù)據(jù)。H ibernate的一級(jí)緩存為Session級(jí)的緩存或事務(wù)級(jí)緩存,是緩存實(shí)體對(duì)象的,不緩存普通屬性,各Session間不能共享一級(jí)緩存數(shù)據(jù);Hibernate的二級(jí)緩存為SessionFactory級(jí)的緩存或進(jìn)程級(jí)的緩存,通常對(duì)讀遠(yuǎn)遠(yuǎn)大于寫(xiě)的數(shù)據(jù)進(jìn)行緩存,可以被所有的session所共享。
緩存機(jī)制3個(gè)標(biāo)志性的特征[3]為緩存粒度、緩存一致性策略以及緩存替換策略。
(1)緩存粒度
在關(guān)系型數(shù)據(jù)庫(kù)中,由行和列組成了完整的記錄。根據(jù)此特點(diǎn)將緩存的粒度分為行緩存、列緩存、混合緩存。其定義分別為:
行緩存:向表中插入一條記錄的時(shí)候,該行記錄的每一列都要建立緩存。此時(shí),緩存的數(shù)據(jù)有一部分對(duì)用戶(hù)來(lái)說(shuō)是冗余的;
列緩存:向表中插入一行記錄的時(shí)候,只對(duì)用戶(hù)頻繁訪問(wèn)的列數(shù)據(jù)進(jìn)行緩存;
混合緩存:根據(jù)用戶(hù)訪問(wèn)的實(shí)際情況,對(duì)某些表的緩存采用行緩存,對(duì)另外的某些表采用屬性列緩存。
(2)緩存一致性策略
根據(jù)緩存數(shù)據(jù)和服務(wù)器端數(shù)據(jù)的一致性程度,將一致性分為強(qiáng)一致性和弱一致性。強(qiáng)一致性要求查詢(xún)事務(wù)讀取的值是數(shù)據(jù)服務(wù)器的最新值;弱一致性可以在本地的緩存上執(zhí)行,如果客戶(hù)端和服務(wù)器端連接斷開(kāi),此時(shí)的緩存可以提供弱一致性。
(3)緩存替換策略
緩存中的數(shù)據(jù)塊一旦失效,需要將新的數(shù)據(jù)塊移入緩存,同時(shí)將失效的數(shù)據(jù)塊移出。常用的緩存替換策略[4]有隨機(jī)替換策略、最近不可能使用策略(LRU)、最近未使用策略(NRU)、最近最少使用策略(LFU)和先進(jìn)先出策略(FIFO)。FIFO[2]的含義是最先進(jìn)入緩存的數(shù)據(jù),在緩存空間不夠的情況下(超出最大元素限制時(shí))會(huì)被最先清理出去。LFU的含義是使用頻率低的元素最先被清理掉。LRU的含義是最近最少使用的緩存的元素最早被清出緩存。在以上5種緩存更新算法中,先進(jìn)先出策略和最近未使用策略雖然實(shí)現(xiàn)簡(jiǎn)單,但效率不高;LFU和LRU策略符合局部性原理,但是當(dāng)緩存中的對(duì)象數(shù)目增加時(shí)效率會(huì)迅速下降;隨機(jī)替換算法則最簡(jiǎn)單,效率一般。
(1)事務(wù)范圍
事務(wù)范圍的緩存只能被當(dāng)前事務(wù)訪問(wèn),每個(gè)事務(wù)都有各自的緩存,緩存的生命周期依賴(lài)于事務(wù)的生命周期,當(dāng)事務(wù)結(jié)束時(shí),緩存的生命周期才會(huì)結(jié)束。事務(wù)范圍的緩存使用內(nèi)存作為存儲(chǔ)介質(zhì),一級(jí)緩存就屬于事務(wù)范圍。
(2)應(yīng)用范圍
應(yīng)用程序的緩存可以被應(yīng)用范圍內(nèi)的所有事務(wù)共享訪問(wèn)。緩存的生命周期依賴(lài)于應(yīng)用的生命周期,當(dāng)應(yīng)用結(jié)束時(shí),緩存的生命周期才會(huì)結(jié)束。應(yīng)用范圍的緩存可以使用內(nèi)存或硬盤(pán)作為存儲(chǔ)介質(zhì),二級(jí)緩存就屬于應(yīng)用范圍。
(3)集群范圍
在集群環(huán)境中,緩存被一個(gè)機(jī)器或多個(gè)機(jī)器的進(jìn)程共享,緩存中的數(shù)據(jù)被復(fù)制到集群環(huán)境中的每個(gè)進(jìn)程節(jié)點(diǎn),進(jìn)程間通過(guò)遠(yuǎn)程通信來(lái)保證緩存中數(shù)據(jù)的一致性。
鐵路客票系統(tǒng)是一個(gè)功能龐大的C/S模式的分布式系統(tǒng),實(shí)現(xiàn)窗口、自動(dòng)售票機(jī)等終端用戶(hù)對(duì)各車(chē)站、鐵路局、鐵道部數(shù)據(jù)庫(kù)服務(wù)器的訪問(wèn)。根據(jù)業(yè)務(wù)的需要,分為靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)。靜態(tài)數(shù)據(jù)包括一般不發(fā)生改變和列車(chē)調(diào)圖發(fā)生改變等數(shù)據(jù)類(lèi)型;動(dòng)態(tài)數(shù)據(jù)包括存根類(lèi)、統(tǒng)計(jì)類(lèi)、席位類(lèi)等數(shù)據(jù)。不同類(lèi)型的數(shù)據(jù)存放在不同的服務(wù)器上,發(fā)出一個(gè)申請(qǐng)席位的命令,系統(tǒng)會(huì)根據(jù)提前指定的規(guī)則連接到相應(yīng)服務(wù)器上進(jìn)行判斷,最終給出有效的席位。
目前根據(jù)鐵路客票業(yè)務(wù)訪問(wèn)量的大小制定了靜態(tài)的緩存策略,每個(gè)子系統(tǒng)用戶(hù)在登錄時(shí)會(huì)在本機(jī)緩存該操作員和該窗口的信息,包括操作員權(quán)限、窗口權(quán)限、窗口參數(shù)定義等;業(yè)務(wù)繁忙的鐵路局建立了查詢(xún)服務(wù)器,每個(gè)客戶(hù)端都可以訪問(wèn)該服務(wù)器,加快了發(fā)到站查詢(xún)、余票查詢(xún)的速度。本機(jī)緩存與Hibernate的Session級(jí)緩存保持一致,在各Session間不共享,需要連接到本地服務(wù)器中獲取信息;查詢(xún)服務(wù)器的建立與Hibernate的進(jìn)程級(jí)緩存保持一致,保存了常用的數(shù)據(jù)信息,每個(gè)Session都可以使用該信息來(lái)提高響應(yīng)速度。
本文根據(jù)實(shí)際的應(yīng)用,在客戶(hù)端和遠(yuǎn)程服務(wù)器端用緩存日志動(dòng)態(tài)地調(diào)整緩存配置文件,以達(dá)到理想的緩存命中率。緩存機(jī)制的應(yīng)用模型如圖1所示。
圖1 緩存機(jī)制的應(yīng)用模型圖
客戶(hù)端和遠(yuǎn)程端在業(yè)務(wù)交互時(shí)分別記錄各自的緩存日志,客戶(hù)端在交班后計(jì)算訪問(wèn)命中率,將訪問(wèn)命中率分為高、中、低三級(jí),在本地配置文件中查找命中率為0或低于一定百分率的緩存項(xiàng),用高命中率的新緩存項(xiàng)替代; 遠(yuǎn)程端在業(yè)務(wù)空閑時(shí)每天定時(shí)讀取遠(yuǎn)程緩存日志,將訪問(wèn)命中率分為高、中、低三級(jí),在遠(yuǎn)程配置文件中查找命中率為0或低于一定百分率的緩存項(xiàng),用高命中率的新緩存項(xiàng)替代。通過(guò)對(duì)訪問(wèn)命中率的分析,可以動(dòng)態(tài)調(diào)整緩存項(xiàng),提高系統(tǒng)性能。
2.4.1 本地緩存方案
本地緩存中的數(shù)據(jù)應(yīng)該具備如下特征:
(1)經(jīng)常被讀但基本不被修改的數(shù)據(jù)。
(2)可以被并發(fā)訪問(wèn),但從來(lái)不會(huì)修改的數(shù)據(jù)。
圖2為本地緩存方案,流程如下:
客戶(hù)端登錄鐵路客票子系統(tǒng);
客戶(hù)端下載窗口定義、操作員定義、窗口參數(shù)定義等特有信息;
讀取本地緩存配置文件中的緩存項(xiàng);
根據(jù)緩存項(xiàng)從遠(yuǎn)程緩存服務(wù)器端下載相關(guān)信息,未找到則從源數(shù)據(jù)庫(kù)下載;
在辦理業(yè)務(wù)的過(guò)程中記錄緩存日志;
交班后通過(guò)歷史和當(dāng)日的緩存日志分析命中率,根據(jù)命中率的比例修改本地的緩存配置文件;
退出子系統(tǒng)。
通過(guò)實(shí)際的應(yīng)用動(dòng)態(tài)的調(diào)整配置文件,將利用率高的數(shù)據(jù)在本地進(jìn)行緩存,可以地提高響應(yīng)速度。
圖2 本地緩存方案
2.4.2 遠(yuǎn)程緩存方案
遠(yuǎn)程緩存中的數(shù)據(jù)應(yīng)該具備如下特征:
(1)經(jīng)常被讀但很少修改的數(shù)據(jù);
(2)可以被并發(fā)訪問(wèn)但很少修改的數(shù)據(jù),如:基礎(chǔ)數(shù)據(jù);
(3)可以被并發(fā)訪問(wèn)并且經(jīng)常修改的數(shù)據(jù),如:余票數(shù)據(jù)。
圖3為遠(yuǎn)程緩存方案,流程如下:
圖3 遠(yuǎn)程緩存方案
(1)客戶(hù)端根據(jù)本地緩存項(xiàng)從遠(yuǎn)程緩存服務(wù)器端下載相關(guān)信息,未找到則在遠(yuǎn)程端記錄緩存日志;
(2)每天定時(shí)通過(guò)遠(yuǎn)程緩存日志的歷史和當(dāng)日的記錄分析命中率,根據(jù)命中率的比例修改遠(yuǎn)程的緩存配置文件;
(3)遠(yuǎn)程端根據(jù)配置文件中緩存項(xiàng)的改動(dòng)向源數(shù)據(jù)庫(kù)發(fā)出更新緩存的請(qǐng)求;
(4)源數(shù)據(jù)庫(kù)可以通過(guò)修改復(fù)制服務(wù)器的參數(shù)將新的緩存項(xiàng)所對(duì)應(yīng)的表進(jìn)行復(fù)制等方式動(dòng)態(tài)的調(diào)整遠(yuǎn)程緩存服務(wù)器的數(shù)據(jù)。
鐵路客票系統(tǒng)業(yè)務(wù)量非常龐大,用戶(hù)面向全國(guó)兩千多個(gè)聯(lián)網(wǎng)車(chē)站,一萬(wàn)四千多個(gè)售票窗口,保證系統(tǒng)的運(yùn)行速度是提高旅客滿(mǎn)意度的重要方面。把頻繁使用的數(shù)據(jù)用有效的緩存機(jī)制加載到緩存區(qū)后,可以減少應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源的低效訪問(wèn),使得程序的運(yùn)行性能明顯提升。為了提高系統(tǒng)運(yùn)行效率并達(dá)到理想的緩存命中率,本文設(shè)計(jì)了動(dòng)態(tài)的緩存策略,根據(jù)應(yīng)用系統(tǒng)的運(yùn)行狀況動(dòng)態(tài)地調(diào)整緩存項(xiàng),使緩存機(jī)制得以自適應(yīng)化。
[1] 盧成均. 緩存機(jī)制及其在數(shù)據(jù)存取層中的應(yīng)用模型研究[J]. 計(jì)算機(jī)應(yīng)用與軟件,2008(12).
[2] 敖小玲,黃 晉. Hibernate緩存機(jī)制研究與應(yīng)用 [J]. 計(jì)算機(jī)與現(xiàn)代化, 2010(9).
[3] 袁華華. 移動(dòng)數(shù)據(jù)庫(kù)中復(fù)制與緩存相關(guān)技術(shù)的研究[D].武漢:湖北工業(yè)大學(xué),2008,5.
[4] 方 君,楊壽保,周文煜,王淑玲. 網(wǎng)絡(luò)存儲(chǔ)中分布式I_O緩存機(jī)制研究[J].自然科學(xué)版華中科技大學(xué)學(xué)報(bào).2011(6).