王 鑫
(濰坊學(xué)院,山東 濰坊 261061)
Internet的快速發(fā)展使Web服務(wù)器必須面對訪問者數(shù)量快速增加的局面,這就要求網(wǎng)絡(luò)服務(wù)器需要具備提供大量并發(fā)訪問服務(wù)的能力。因此,對于提供大負(fù)載Web服務(wù)的服務(wù)器來講,CPU、I/O處理能力很快會成為瓶頸,用戶訪問的速度會下降,等待網(wǎng)絡(luò)反應(yīng)的時間將加長。調(diào)查證明,用戶愿意等待網(wǎng)站反應(yīng)的平均時間不足10秒。所以,許多運營商和服務(wù)提供商正在斥巨資來提高網(wǎng)絡(luò)帶寬。
然而,僅僅依靠額外的帶寬還不能解決網(wǎng)絡(luò)等待時間或加速響應(yīng)緩慢的源服務(wù)器的問題。研究發(fā)現(xiàn), H TTP協(xié)議在等待建立連接方面花費了比傳輸數(shù)據(jù)更多的時間,如果能夠減少等待的時間,也就可以加速網(wǎng)絡(luò)的反應(yīng)速度。我們再看一下Web服務(wù)器方從接收到一個用戶的請求到將用戶所要的數(shù)據(jù)傳輸給對方的過程,對每一個請求,服務(wù)器都要先在硬盤上找到相應(yīng)的對象,某些請求還要訪問數(shù)據(jù)庫,然后將數(shù)據(jù)讀出,放入內(nèi)存中,再傳輸給用戶。所以,可以通過減少建立網(wǎng)絡(luò)連接的次數(shù)和加快服務(wù)器端的處理速度來提高整個網(wǎng)絡(luò)的反應(yīng)速度。
緩存技術(shù)有效地縮短了網(wǎng)絡(luò)用戶取回文檔的時間,加快了Web服務(wù)器的反應(yīng)速度。它通過將內(nèi)容移到距離用戶更近的地方解決了這些問題。緩存技術(shù)不僅有利于終端用戶,而且也有利于互聯(lián)網(wǎng)服務(wù)提供商和內(nèi)容提供商。由于未來所有企業(yè)都將實現(xiàn)電子商務(wù),都要面臨峰值負(fù)載下快速響應(yīng)用戶的問題,因此緩存技術(shù)的合理應(yīng)用將為所有的電子商務(wù)網(wǎng)站提供重要的競爭優(yōu)勢。
1.1 客戶端的緩存技術(shù)
在瀏覽器中使用緩存技術(shù)的思路很簡單,把用戶以前訪問的文檔都緩存起來,在用戶以后訪問同樣的文檔時,就可以從瀏覽器的緩存中取出,而不需要重新建立一次H TTP連接。
現(xiàn)今的瀏覽器對一些高級功能如XML、DH TML、Java小程序和遠(yuǎn)程數(shù)據(jù)服務(wù)提供支持,使用相應(yīng)的功能可以執(zhí)行客戶機(jī)驗證數(shù)據(jù)緩存,免去了到Web服務(wù)器的往返??梢越档蚖eb服務(wù)器上的負(fù)載,并能減少網(wǎng)絡(luò)通信量以及服務(wù)器訪問的任何后臺資源。所以,如果可能,則應(yīng)該在瀏覽器里擴(kuò)大緩存容量。
1.2 代理端的緩存技術(shù)
建立一個緩存代理可以使分布的用戶訪問網(wǎng)絡(luò)時都經(jīng)過這個代理。這樣能加快使用該代理用戶的網(wǎng)絡(luò)反應(yīng)速度,因為一個用戶訪問一個文檔時,由于該文檔在早些時候被另一個該局域網(wǎng)的用戶訪問過而在緩存中,對這個用戶來說,文檔就可以直接從代理的緩存中獲得,而不必到原始的Web服務(wù)器中去取了。所以,如果客戶的Web瀏覽器配置Proxy代理服務(wù)器的IP地址及TCP端口號,這樣客戶的所有Web請求都經(jīng)過緩存的代理訪問Internet。在緩存服務(wù)器代理用戶請求訪問Internet之前,它先檢查自身是否已經(jīng)緩存了用戶請求訪問的Web對象,如果已經(jīng)緩存并且沒有過期,那么就用本地緩存的Web對象響應(yīng)客戶的請求,從而加快了用戶的訪問時間,并且節(jié)省了寶貴的廣域網(wǎng)鏈路帶寬資源。此種類型稱為Forward -Proxy正向代理。
另一種類型稱為 Transparent-cache透明緩存,與Fo rw ard-Proxy正向代理類型的唯一區(qū)別在于,無需在客戶的Web瀏覽器中配置任何信息,現(xiàn)在有多種設(shè)備能與緩存服務(wù)器配合可實現(xiàn)代理功能。
1.3 服務(wù)器端的緩存技術(shù)
服務(wù)器端緩存的目的是縮短服務(wù)器對用戶請求的反應(yīng)時間、增加服務(wù)器的吞吐量。
1.3.1 內(nèi)容緩存
當(dāng)用戶訪問Web服務(wù)器存取H TML頁面時,一般Web服務(wù)器需要從硬盤上讀取H TM L文件,然后傳輸給用戶。每次用戶訪問,Web服務(wù)器都重復(fù)相同的處理過程。
內(nèi)容緩存則將用戶經(jīng)常訪問的H TML頁面或者Web處理結(jié)果存儲在服務(wù)器的內(nèi)存當(dāng)中,在用戶請求某一服務(wù)時,服務(wù)器首先從內(nèi)存中檢索是否有相同的結(jié)果,如果存在,則不必重新處理,而直接將結(jié)果返給用戶。由于內(nèi)存的存取速度遠(yuǎn)比硬盤的存取速度快,所以服務(wù)器系統(tǒng)的響應(yīng)時間可以縮短。
1.3.2 數(shù)據(jù)庫連接緩存
我們知道,通常用戶通過Web服務(wù)器訪問數(shù)據(jù)庫時,Web上的應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間需要首先建立連接,然后才能存取數(shù)據(jù),在處理結(jié)束后,這種連接被關(guān)閉。每次用戶訪問都需要重復(fù)這樣的步驟。由于數(shù)據(jù)庫連接過程比較消耗系統(tǒng)資源,而且時間開銷也比較大,尤其是利用公共網(wǎng)關(guān)接口CGI(Common Gateway Interface)進(jìn)行連接時,效率尤其低,通常情況下,連接過程對系統(tǒng)響應(yīng)時間的影響是很大的。
數(shù)據(jù)庫連接緩存是指在Web服務(wù)器和數(shù)據(jù)庫服務(wù)器之間建立經(jīng)常性的連接,當(dāng)用戶需要訪問數(shù)據(jù)庫時,直接利用這些已經(jīng)存在的連接,操作結(jié)束后,連接仍然保持而不關(guān)閉,這樣一來,用戶訪問數(shù)據(jù)庫的步驟被簡化,進(jìn)而提升系統(tǒng)的效率。
Web訪問模式具有較好的時間局部性(最近訪問的對象在最近的將來還可能被再次訪問),這一點就導(dǎo)致了基于LRU的替換策略應(yīng)是緩存的首選策略;另外,Web對象的訪問頻度在短時間內(nèi)不穩(wěn)定,但在較長的時間段內(nèi)相對平穩(wěn),因此在緩存替換策略中通常還要考慮到長期訪問頻度的影響。
基于緩存的上述特點,可用于緩存中的替換算法如下:
(1)FIFO:這是最簡單的一種替換策略,就是先進(jìn)先出。當(dāng)然這種替換策略的效率也是最低的。
(2)LRU(Least Recently U sed):最近最久未被訪問的對象被替換,最先移出最近最少使用的對象,其優(yōu)點是實現(xiàn)簡單(基于時間局部性,過去最久未被訪問的在將來最不可能被訪問),此策略用在緩存中是很有效的。其缺點是沒有考慮對象大小或延遲時間。
(3)Size策略:首先清除大對象,如果一樣大,那么最長時間沒有被使用的對象被首先替換掉。其優(yōu)點是移出大文檔,可以保留更多的小文檔,產(chǎn)生更高的請求命中率。其缺點是可能使小文檔永遠(yuǎn)留在緩存器中,字節(jié)命中率偏低,且再次下載大對象時,占用網(wǎng)絡(luò)資源很多。
(4)GD-Size算法:Greedy-Dual Size算法。這是個基于代價的貪婪算法。緩存器中的每個頁面都有相應(yīng)的價值H,當(dāng)網(wǎng)頁被帶進(jìn)緩存器時,該網(wǎng)頁的 H值為1/Size。發(fā)生替換時,最小 H的頁面(minH)被換出,剩下的頁面的H值變?yōu)樘鎿Q前的H值減去minH。如果頁面被再次訪問,則恢復(fù)其原來的價值。該算法的優(yōu)點是不再被訪問的頁面會被清除,克服了Size算法的缺點。
但是,在傳統(tǒng)的緩存替換算法中的LFU(least frequency used)和LRU(我們已知道LRU是將上一次使用時間最短的數(shù)據(jù)優(yōu)先存放在緩存中,LFU則是將過去使用頻率高的數(shù)據(jù)優(yōu)先保存在緩存中)這兩種算法代表了兩個極端,LFU使用數(shù)據(jù)的訪問頻率,有利于數(shù)據(jù)的總體優(yōu)化使用,但不利于數(shù)據(jù)訪問方式的變化和猝發(fā)訪問。LRU依據(jù)最近一次的訪問時間,能較好地適應(yīng)數(shù)據(jù)訪問的變化,但只是在訪問時間上的局部優(yōu)化,沒有考慮數(shù)據(jù)長期的訪問特性。有一些算法如LRU的變種LRFU和LRU-K等試圖在數(shù)據(jù)的訪問時間和訪問頻率兩方面達(dá)到平衡。如LRFU算法給近幾次訪問時間乘上一個與訪問頻率有關(guān)的權(quán)重,以加權(quán)值來取得兩者之間的平衡。LRU-K算法則是使用最后第 K次訪問時間來擴(kuò)展LRU算法,依靠K值的大小進(jìn)行平衡。它們都是對訪問時間的修正,是對LRU算法的改進(jìn),我們在緩存的替換算法中可以采用。還有幾種可以利用的改進(jìn)算法如下:
(1)Log(Size)+LRU(LRU-M IN):先判斷大小,先讓大對象使用LRU策略,然后再對連續(xù)的小對象使用。
(2)LRU-Threshold:在LRU上設(shè)置一個上限值,大于它的從不被緩存。當(dāng)對于不需要發(fā)生替換的緩存大小,磁盤大小較小時采用這個策略。可以保證一定緩存空間,并有比LRU-M IN更高的性能。這個策略的缺點是,理想上限的值主要依賴于緩存的工作量和磁盤大小。
(3)先使用LRU-M IN策略,直到緩存大小達(dá)到可達(dá)磁盤大小的100%,改用LRU-Threshold,設(shè)置上限,上限逐漸減小直到緩存大小達(dá)到低水準(zhǔn)。
(4)Hybrid:目標(biāo)為減小總延遲?;镜腖FU算法總是替換具有最低訪問頻度的對象,對它的改進(jìn)也要考慮到不同的對象大小和失效開銷。在Hybrid算法中,設(shè)計了一個函數(shù),計算緩存里存放的對象的值。函數(shù)值最小的對象被替換。例如,在服務(wù)器S上的對象P的函數(shù)依賴如下參數(shù):Cs,連接服務(wù)器S的時間; Bs,到服務(wù)器S的帶寬;Np,P進(jìn)入緩存后被訪問的次數(shù);Zp,對象P的大小(字節(jié)數(shù))。函數(shù)定義如下:
W b和W n是常數(shù),Cs和Bs的估算基于最近的過去中從服務(wù)器S取得的文檔數(shù)量。
要讓用戶訪問到最新的內(nèi)容,就要保證在當(dāng)前緩存中的對象必須是最新的。所以,對已經(jīng)緩存的內(nèi)容進(jìn)行及時更新是緩存能發(fā)揮作用的另一關(guān)鍵所在。
緩存靜態(tài)頁面后,更新時間間隔可能很長,而緩存的動態(tài)頁面需根據(jù)實際情況動態(tài)更新。為了保證客戶瀏覽到最新的動態(tài)內(nèi)容,可以在服務(wù)器端利用三種方法決定緩存何時被清除或過期:時間、事件、手動。
3.1 時間
通過在服務(wù)器中設(shè)置網(wǎng)頁的生存時間來自動更新緩存內(nèi)容。
3.1.1 頭標(biāo)志
使用ASP技術(shù)的電子商務(wù)網(wǎng)站,可以在服務(wù)器上設(shè)置Expires頭標(biāo)志,或者通過使用標(biāo)記來設(shè)置到期時間。在服務(wù)器端的ASP文件中可以設(shè)置Response.Expires或Response.ExpiresA bsolute,要設(shè)置頁面使其過多長分鐘后到期,如15分鐘,可以如下設(shè)置:
若將Response.Expires的設(shè)置為負(fù)數(shù)或0,則可以禁用緩存。用另外一個屬性Response.ExpiresAbsolute將可以設(shè)置內(nèi)容過期的具體時間:
如果使用標(biāo)記來設(shè)置Expires頭標(biāo)志,可以使用下面的語法:
在PHP中,一個可緩存的頁面必須包含Last-Modified標(biāo)記。
一般純靜態(tài)頁面本身都會有Last-Modified信息,動態(tài)頁面需要通過函數(shù)強(qiáng)制加上:
另外,必須有Expires或Cache-Control:max-age標(biāo)記設(shè)置頁面的過期時間。對于靜態(tài)頁面,通過apache的mod_expires根據(jù)頁面的M IM E類型設(shè)置緩存周期。對于動態(tài)頁面,則可以直接通過寫入 H TTP返回的頭信息,比如對于新聞首頁index.php可以是20分鐘,而對于具體的一條新聞頁面可能是1天后過期。比如:在php中加入了1個月后過期:
3.1.2 “懶惰”更新
我們知道Internet Exp lo rer 5有一項叫作Lazy Update(“懶惰”更新)的新特性。同樣,利用Lazy Update性能可使服務(wù)器將一個對象緩存起來,同時又可以計算此對象的被點擊數(shù)。這對廣告圖像、首頁或搜索頁是非常有用的。在這些頁面上,用戶可以立即看到頁面,又可以在某些地方更新內(nèi)容并且跟蹤記錄有多少人已看過你的頁面。對于一個Lazy Update頁面,在它首次被訪問時,其上的對象就被下載并被高速緩存起來。接下來,用戶看到的是被緩存起來的內(nèi)容。如果服務(wù)器有了新的內(nèi)容,則該頁面將會在后臺被下載到高速緩存中。當(dāng)用戶下次訪問該頁面時,將顯示被更新的內(nèi)容。還可以為某些緩存頁面記錄更新時間,時間到期后,便立即連接Web服務(wù)器,刷新緩存內(nèi)容,在此,可以利用H TTP頭信息使用兩種新的時間間隔指示:p re-check和post-check。用p re-check擴(kuò)展名定義一段時間間隔(以秒記):在這段時間間隔之后,一個對象在顯示給用戶之前應(yīng)被選中進(jìn)行更新。選中對象也可以發(fā)生在該對象已經(jīng)顯示給用戶之后,但是,要保證在用戶下次想要看這個對象時,被高速緩存起來的副本是更新過的。用post -check擴(kuò)展名定義另一段時間間隔(以秒記):在這段時間之后,在顯示給用戶之前,該對象被選中進(jìn)行更新。
3.2 事件
Web服務(wù)器還應(yīng)該能夠通過某一事件被觸發(fā)確保緩存內(nèi)容是最新的。這些事件可能是來自數(shù)據(jù)庫、客戶端訪問、內(nèi)容管理系統(tǒng),或任何可被追蹤的事件。例如,當(dāng)數(shù)據(jù)庫某個項目的數(shù)值被改變時會導(dǎo)致某些緩存內(nèi)相關(guān)的頁面實體被清除。服務(wù)器如果有外部事件管理功能,就可以讓用戶能輕易地配置對某一文件的緩存操作。
3.3 手動
根據(jù)實際情況,通過發(fā)出手動指令,管理員能在任何時間更新頁面實體或整個緩存,使之真正成為市場驅(qū)動的Web網(wǎng)站,從而能保持產(chǎn)品信息隨條件改變而實時更新。
Web中的緩存技術(shù)加快了最終用戶訪問Internet的時間,節(jié)省了與寬帶接入服務(wù)提供商聯(lián)接的費用,不僅滿足了網(wǎng)站最終用戶對訪問速度的要求,加強(qiáng)了客戶的滿意度,同時也減輕了網(wǎng)站原始Web服務(wù)器的負(fù)載,這對網(wǎng)站帶來的好處是顯而易見的。另外,對緩存內(nèi)容的進(jìn)行合理替換和即時更新更是必需的,這也正是緩存能真正發(fā)揮作用的關(guān)鍵所在。
[1]Larry L Peterson.Computer Netwo rks A System s App roach[M].北京:機(jī)械工業(yè)出版社,2004.
[2]Kevin Dow nes.Internetworking Technology Handbook[M].Macmillan Computer Publishing,1999.
[3]Tere Parnell.Guide to Buiidind High-Speed Netwo rks[M].北京:機(jī)械工業(yè)出版社,1998.
[4]虞春宜.Cache技術(shù)在萬維網(wǎng)上的應(yīng)用[J].計算機(jī)工程與應(yīng)用,2002,(2):147-149.
[5]林永旺.Web緩存的一種新的替換算法[C].北京:中國科學(xué)院計算機(jī)網(wǎng)絡(luò)信息中心,2001.
[6]范毅波.一“緩”一“急”:Web緩存加速Internet[N].網(wǎng)絡(luò)世界,2001-01-15.