周建儒
摘要: 緩存技術(shù)在web開發(fā)中應(yīng)用廣泛,合理的緩存技術(shù)可以減輕服務(wù)器負(fù)擔(dān),提升系統(tǒng)性能,尤其在大型網(wǎng)站建設(shè)中,使用Memcached緩存技術(shù)能夠有效地增強(qiáng)系統(tǒng)的緩存性能。在分析Memcached的原理與特征的基礎(chǔ)上,結(jié)合實(shí)際項(xiàng)目探討了Memcached在大型網(wǎng)站中如何應(yīng)用。
關(guān)鍵詞: 大型網(wǎng)站;緩存技術(shù);Memcached
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)01-0057-03
Memcached Used in the Construction of Large Sites
ZHOU Jian-ru
(Sichuan Information Technology College, Guangyuan 628040,China)
Abstract: Caching technology widely in web development application, reasonable caching technology can reduce server load, improve system performance, especially in large-scale construction site, using Memcached caching technology can effectively enhance the performance of the system cache. In the analysis of the principles and characteristics of Memcached on the basis of the actual project explores how Memcached applications in a large site.
Key words: Large sites; caching; Memcached
隨著現(xiàn)代互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,應(yīng)用系統(tǒng)的復(fù)雜度增大、數(shù)據(jù)量不斷增長、高并發(fā)請求增多,服務(wù)器的負(fù)擔(dān)也隨之加重,數(shù)據(jù)庫響應(yīng)速度變慢,網(wǎng)頁顯示延遲等這些問題也越發(fā)突出。數(shù)據(jù)緩存技術(shù)成為解決這些問題的主要途徑。緩存技術(shù)已經(jīng)成為一個并發(fā)訪問量大的應(yīng)用系統(tǒng)不可缺少的關(guān)鍵技術(shù),緩存方案設(shè)計(jì)的好壞直接關(guān)系到網(wǎng)站訪問的速度。目前,很多的大型網(wǎng)站都使用 Memcached來支持海量級的頁面訪問量。通過把 cache 層與Web 架構(gòu)集成,可以提高應(yīng)用程序的性能,并降低數(shù)據(jù)庫的負(fù)載。
1 Memcached簡介
Memcaehed是danga.com的一個項(xiàng)目,開發(fā)Memcaehed的目的是為了提高LiveJournal的訪問速度,以后逐漸被應(yīng)用在大型網(wǎng)站建設(shè)中。
Memcached是一個免費(fèi)開源的、高性能的、分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài) Web 應(yīng)用中提升訪問速度[1],可以滿足不同主機(jī)上的多個用戶同時(shí)訪問該緩存系統(tǒng)。Memcached通過在內(nèi)存中維護(hù)一個統(tǒng)一的hash表來管理緩存數(shù)據(jù),它和數(shù)據(jù)庫是獨(dú)立的,用戶無需知道數(shù)據(jù)存在何處。Memcached可以存儲各種類型的數(shù)據(jù)(例如文件、視頻、圖像等),它不僅解決了共享內(nèi)存只能是單機(jī)的弊端,同時(shí)也解決了數(shù)據(jù)庫檢索的壓力,最大的優(yōu)點(diǎn)是提高了訪問獲取數(shù)據(jù)的速度[3]。
2 Memcached工作原理
Memcached技術(shù)是一個數(shù)據(jù)緩存的工具,常應(yīng)用于Web應(yīng)用中,主要目的是提升訪問速度,同時(shí)減輕數(shù)據(jù)庫負(fù)載。Memcached緩存技術(shù)是在內(nèi)存中緩存數(shù)據(jù)和對象,客戶端應(yīng)用可以直接從緩存中讀取數(shù)據(jù),這樣就避免了頻繁讀取數(shù)據(jù)庫,從而提高網(wǎng)站的響應(yīng)速度。Memcached緩存技術(shù)是基于一個存儲鍵-值對的hashmap,客戶端應(yīng)用通過Memcached協(xié)議與守護(hù)進(jìn)程通信。Memcached并不提供冗余,當(dāng)某個服務(wù)器停止運(yùn)行或崩潰了,所有存儲在該服務(wù)器上數(shù)據(jù)就消失了。Memcached工作原理如圖1所示,圖中細(xì)線箭頭表示首次訪問頁面時(shí)從RDBMS中取得數(shù)據(jù)保存到Memcached中,粗線箭頭表示第二次以后訪問頁面時(shí)從Memcached中取數(shù)據(jù)顯示[4]。
圖1 Memcached與數(shù)據(jù)庫協(xié)同工作原理
3 Memcached的主要特征
Memcached是一種分布式的用于數(shù)據(jù)緩存的服務(wù)器,它的特征如下。
(1) 內(nèi)置的內(nèi)存管理方式
為了提高性能,Memcached中保存的數(shù)據(jù)都存儲在它內(nèi)置的內(nèi)存存儲空間中,當(dāng)存儲的數(shù)據(jù)量達(dá)到預(yù)設(shè)容量值之后,可以通過LRU淘汰算法,或者通過刪除和設(shè)置失效時(shí)間來自動刪除內(nèi)存中的數(shù)據(jù)。Memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,不能持久保存數(shù)據(jù),由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟服務(wù)器或者M(jìn)emcached進(jìn)程中止數(shù)據(jù)就會丟失。
(2) 分布式
Memcached服務(wù)器端沒有分布式的功能,僅有存儲功能,其分布式是由客戶端程序?qū)崿F(xiàn)的[2]。Memcached服務(wù)器是獨(dú)立的存取數(shù)據(jù)的,多個服務(wù)器之間不會共享數(shù)據(jù),也互不通信。可以在多臺服務(wù)器上安裝Memcached來組建一個緩存服務(wù)器集群,通過hash來分散存儲,存儲位置只與關(guān)鍵字相關(guān),這樣就可以減輕數(shù)據(jù)庫的響應(yīng)壓力,并且它具有故障測試,負(fù)載分配等功能。
4 Memcached的應(yīng)用
Memcached作為緩存服務(wù)器,其應(yīng)用場景主要是針對一些訪問量大的應(yīng)用系統(tǒng),比如電子商務(wù)網(wǎng)站,其網(wǎng)站首頁必定有一個商品分類導(dǎo)航欄,當(dāng)點(diǎn)擊某個具體分類時(shí),其網(wǎng)頁就加載該類別的商品。實(shí)現(xiàn)該功能,一般的做法就是執(zhí)行SQL語句,查詢出全部的商品分類并顯示在頁面上,當(dāng)訪問量很多的時(shí)候,每打開一次網(wǎng)頁,就要去執(zhí)行一次SQL語句,這就增加了數(shù)據(jù)庫的連接數(shù),當(dāng)訪問量到達(dá)一定數(shù)量時(shí),就很可能使數(shù)據(jù)庫崩潰,甚至讓系統(tǒng)癱瘓。在這種情況下,如果使用緩存技術(shù),就可以有效避免這種事情的發(fā)生。因?yàn)樯唐贩诸愖鳛閷?dǎo)航欄是不會經(jīng)常改變的,實(shí)時(shí)性不是很高,這樣我們就可以把商品分類放到緩存中。其解決方案為,加入Memcached緩存,首先第一次顯示的時(shí)候,判斷Memcached緩存中是否有該商品分類,如果沒有,執(zhí)行一次SQL語句,從數(shù)據(jù)庫中查詢所有的商品分類,然后放到Memcached中,進(jìn)入處理數(shù)據(jù)并顯示頁面。當(dāng)?shù)诙芜M(jìn)行訪問時(shí),Memcached緩存中就有了該商品分類的數(shù)據(jù),就可以直接從Memcached中取出數(shù)據(jù)進(jìn)行處理并顯示到頁面上,不需要再次執(zhí)行SQL語句從數(shù)據(jù)庫中去讀取數(shù)據(jù),這樣便減少了數(shù)據(jù)庫的連接和訪問時(shí)間。
Memcached的應(yīng)用主要分為Memcached服務(wù)器端的安裝配置和客戶端使用。服務(wù)器端主要和應(yīng)用服務(wù)器(比如:Tomcat)安裝在同一臺機(jī)器上,客戶端使用主要是程序代碼的調(diào)用和存儲。
4.1 服務(wù)器安裝
在此以Windows系統(tǒng)的服務(wù)器為例介紹Memcached的安裝。首先下載Memercached For Windows并解壓,然后直接運(yùn)行 memcached.exe 或者用cmd打開命令窗口,轉(zhuǎn)到解壓文件所在的目錄,輸入命令memcached.exe -d install執(zhí)行,結(jié)束后在控制面板中打開服務(wù),可以看到Memcached了,如果沒有啟動就手動啟動。
4.2 客戶端應(yīng)用
Memcached作為緩存工具,其客戶端程序可以使用多種開發(fā)語言來實(shí)現(xiàn),針對Java而言,目前的實(shí)現(xiàn)就有三種方法,分別為Memcached Client for Java,SpyMemcached和XMemcached。Memcached Client for Java比SpyMemcached更穩(wěn)定、更早、更廣泛。SpyMemcached比 Memcached Client for Java更高效。XMemcached比 SpyMemcache并發(fā)效果更好。所以對訪問量高的電子商務(wù)網(wǎng)站而言,采用并發(fā)效果好的XMemcached來實(shí)現(xiàn)客戶端是比較好的選擇。以下就以一個具體的項(xiàng)目為例進(jìn)行說明,該項(xiàng)目是一個商業(yè)項(xiàng)目的demo,使用maven進(jìn)行管理,采用struts2+spring+mabatis架構(gòu),將Memcached與spring進(jìn)行了集成。該項(xiàng)目架構(gòu)如圖2所示。
圖2 項(xiàng)目架構(gòu)
首先通過maven將xmemcached-2.0.0.jar包導(dǎo)入項(xiàng)目,再將Memcached與spring集成,在spring配置文件中進(jìn)行如下配置,核心代碼如下所示。
4.3 在業(yè)務(wù)層使用Memcached
Memcached 用于功能接口的定義,在業(yè)務(wù)層可以直接使用,可以屏蔽各種客戶端實(shí)現(xiàn)API之間的差異,從而實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)與客戶端解耦合的目的,如果以后要換客戶端的實(shí)現(xiàn),對業(yè)務(wù)系統(tǒng)不會有影響。核心代碼如下所示。
public String selectUser(HttpServletRequest request,Model model) throws TimeoutException, InterruptedException, MemcachedException{
Long tr = new Date().getTime();
Map param = new HashMap();
List
user = (List) memcachedClient.get("userList");
if(user == null) {
user = serviceManager.getUserManagerService().selectUser(param);
memcachedClient.set("userList", 0, user);
}
model.addAttribute("userList", user);
Long tq = new Date().getTime();
Long tp = tq - tr ;}
上述代碼在運(yùn)行過程中,當(dāng)加入緩存后,其信息展示的速度會有明顯的提升。
5 總結(jié)
Memcached在高并發(fā)的數(shù)據(jù)查詢系統(tǒng)中發(fā)揮良好的性能,因?yàn)樵L問Memcached中的內(nèi)存數(shù)據(jù)要比數(shù)據(jù)庫的磁盤數(shù)據(jù)快很多。
文中主要探討了Memcached主要特征以及在大型網(wǎng)站中如何應(yīng)用。在網(wǎng)站建設(shè)中使用Memcached之后,可以減少數(shù)據(jù)庫連接、查詢等操作,降低了數(shù)據(jù)庫負(fù)載。系統(tǒng)的運(yùn)行速度提高了,優(yōu)化了網(wǎng)站的性能。
參考文獻(xiàn):
[1] 郭棟,王偉.基于Memcached的緩存資源集中管理方法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013(12):62-65.
[2] 鄧?yán)?,吳?電子政務(wù)中跨域可信數(shù)據(jù)交換模型設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2007,33(12):4-6.
[3] 俞華鋒.Memcached在大型網(wǎng)站中的應(yīng)用[J].科技信息,2008(1):70-71.
[4] 宗小忠.基于Memcached構(gòu)建Web緩存服務(wù)器[J].電腦知識與技術(shù),2011(5):104-105.