閻麗欣
摘要:本文對(duì)Memcached在Web緩存中的應(yīng)用進(jìn)行研究。首先,介紹了緩存技術(shù)及緩存替換策略;然后,在此基礎(chǔ)上說明Memcached分布式緩存及其特點(diǎn)和工作原理;最后,闡述了基于Memcached的緩存系統(tǒng)。
[關(guān)鍵詞]MemcachedWeb緩存分布式緩存系統(tǒng)
當(dāng)前互聯(lián)網(wǎng)絡(luò)的主要訪問方式是Web應(yīng)用方式,隨著網(wǎng)絡(luò)資源用戶訪問量的增加,Web服務(wù)器的響應(yīng)速度會(huì)變得越來越慢,因此難以滿足大量用戶的需求。緩存技術(shù)可以解決大量用戶并發(fā)訪問Web服務(wù)時(shí)存在的問題,設(shè)計(jì)優(yōu)良的緩存機(jī)制能夠有效降低數(shù)據(jù)的重復(fù)傳輸,提高用戶體驗(yàn)。
1緩存技術(shù)
一般認(rèn)為應(yīng)用程序的訪問具備局部性的特點(diǎn):時(shí)間局部性指的是當(dāng)前被訪問的內(nèi)存單元的數(shù)據(jù)在短期內(nèi)還有可能被再次訪問,空間局部性指的是被訪問的內(nèi)存單元周圍的數(shù)據(jù)也極有可能被訪問?;谶@樣的考慮,為了加快程序的范圍速度,可以增加一個(gè)緩存進(jìn)行數(shù)據(jù)的預(yù)讀,存儲(chǔ)可能會(huì)被頻繁請求的數(shù)據(jù)。
在用戶訪問Web站點(diǎn)時(shí),從輸入網(wǎng)址并回車到查詢的頁面展現(xiàn)出來經(jīng)歷了如下過程:輸入網(wǎng)址后的地址解析。為了方便記憶,網(wǎng)址一般是點(diǎn)分字母形式,在用戶回車后瀏覽器會(huì)進(jìn)行地址解析,即把域名網(wǎng)址轉(zhuǎn)換為IP地址。這一過程會(huì)用到瀏覽器緩存、系統(tǒng)緩存、路由器緩存以及DNS緩存。瀏覽器緩存指的是瀏覽器的緩存目錄,如果其中有域名對(duì)應(yīng)的映射關(guān)系則會(huì)直接調(diào)用;系統(tǒng)緩存指的是本機(jī)操作系統(tǒng)的緩存;如果瀏覽器及本機(jī)系統(tǒng)緩存中都沒有域名的映射關(guān)系,則從網(wǎng)絡(luò)層查找路由器中的域名系統(tǒng)緩存;如果此時(shí)域名解析還是失敗,則需要從域名服務(wù)器DNS中解析。
緩存的容量不是無限的,在容量不夠的時(shí)候需要剔除部分舊的緩存對(duì)象,以存儲(chǔ)新的緩存對(duì)象。緩存替換策略指的是剔除舊緩存對(duì)象時(shí)的規(guī)則,常用的緩存替換策略有先進(jìn)先出法(FIFO)、最近最少使用法(LRU)以及最少使用頻繁法(LFU)。
2Memcached及分布式緩存
作為一個(gè)高效的分布式緩存系統(tǒng),Memcached會(huì)在內(nèi)存中維護(hù)一°個(gè)大容量Hash表,以便緩存圖片、文件、視頻等各種格式的數(shù)據(jù)。下次再請求同樣的數(shù)據(jù)時(shí)就可以直接從緩存中獲取,避免對(duì)數(shù)據(jù)庫、磁盤等低效率數(shù)據(jù)的重復(fù)訪問及存取,而且可以避免數(shù)據(jù)的重復(fù)傳輸,從而提高響應(yīng)速度。Memcached的原理如圖1所示。
通常情況下Memcached多用于流量較大的網(wǎng)站,把Memcached作為大的數(shù)據(jù)緩沖區(qū),保存前端用戶經(jīng)常訪問的數(shù)據(jù)。Memcached是分布式緩存系統(tǒng)的主程序,以守護(hù)進(jìn)程的形式存在,可以隨時(shí)接收客戶端的連接及其他操作,以便訪問共享內(nèi)存中的數(shù)據(jù)。
Memcached分布式緩存技術(shù)的特點(diǎn)包括:(1)簡單的協(xié)議。Memcached是基于文本的,因此只要能夠遠(yuǎn)程登錄到Memcached服務(wù)器,即可進(jìn)行數(shù)據(jù)的存取。
(2)高性能的事件處理。綜合了Linux系統(tǒng)的epoll、BSD操作系統(tǒng)的kqueue等事件處理機(jī)制,性能更高效。
(3)使用最近最少使用(LRU)緩存替換算法,在緩存空間不足時(shí),先剔除最近最少使用的數(shù)據(jù),符合緩存設(shè)計(jì)的初衷。
(4)分布式緩存。不同的Memcached服務(wù)器間是分布式的,獨(dú)立完成各自工作的基礎(chǔ)上不會(huì)影響彼此。
在Memcached啟動(dòng)后,服務(wù)器會(huì)為其分配內(nèi)存以便緩存數(shù)據(jù);Memcachced不間斷的監(jiān)聽配置的服務(wù)端口,一旦有外部請求就會(huì)解析請求命令,并把請求的數(shù)據(jù)傳輸給對(duì)應(yīng)的功能模塊。如果請求命令是緩存設(shè)置命令,則會(huì)檢查緩存空間,如果緩存空間不夠則替換不常用的緩存;如果請求命令是獲取命令,則需要借助哈希算法計(jì)算獲取資源的存放位置。
Memcached自身是沒有分布式功能的,但其高效的存儲(chǔ)、各種API非常容易實(shí)現(xiàn)分布式的負(fù)載均衡、數(shù)據(jù)一致性以及多副本管理等分布式特性。Memcached的基本數(shù)據(jù)結(jié)構(gòu)是Item和Slab,結(jié)構(gòu)成員包括Chunk大小、Chunk數(shù)目、可用的Item(Slab)數(shù)、最后可用Item(Slab)的起始地址等;這些結(jié)構(gòu)的成員為Memcached分配最小的內(nèi)存單元,不僅可以用于存放緩存數(shù)據(jù),還可以保存緩存數(shù)據(jù)的引用計(jì)數(shù)、訪問信息、下一個(gè)副本的地址等;另外,這些信息在哈希表中也有相應(yīng)記錄,所以可以快速定位存儲(chǔ)位置。
啟動(dòng)Memcached程序后,分配的所有內(nèi)存會(huì)被劃分給多個(gè)Slab,它們的大小彼此不同,目的是使操作系統(tǒng)可以更有效的利用內(nèi)存資源,減少內(nèi)存碎片。接下來,會(huì)選擇運(yùn)行時(shí)的協(xié)議,是文本類型的協(xié)議還是二進(jìn)制的協(xié)議。協(xié)議選擇完畢后會(huì)啟動(dòng)多線程完成初始化工作,并循環(huán)等待。每次有新請求到達(dá),Memcached就進(jìn)行協(xié)議判斷,并從中提取相應(yīng)的命令,發(fā)送給對(duì)應(yīng)的命令模塊處理。
3基于Memcached的緩存系統(tǒng)
使用Memcached實(shí)現(xiàn)緩存系統(tǒng)時(shí),需要建立一個(gè)緩存管理節(jié)點(diǎn)以及緩存維護(hù)節(jié)點(diǎn)。緩存管理節(jié)點(diǎn)中保存整個(gè)Memcached集群的元數(shù)據(jù)信息;緩存維護(hù)節(jié)點(diǎn)用于在出現(xiàn)問題時(shí)修復(fù)Memcached緩存系統(tǒng)。
在存儲(chǔ)元數(shù)據(jù)時(shí),需要對(duì)緩存數(shù)據(jù)的關(guān)鍵字key值進(jìn)行排序,然后用B+樹結(jié)構(gòu)的形式建立索引,B+樹的葉子節(jié)點(diǎn)存放數(shù)據(jù)信息。在進(jìn)行查詢操作時(shí),使用關(guān)鍵字一層層地便利B+樹,最終查找到數(shù)據(jù)的存放位置。在進(jìn)行插入操作時(shí),先找到插入位置,然后把原位置后的數(shù)據(jù)后移如果后移挪出的存儲(chǔ)空間不夠,并且預(yù)留的緩存空間也存滿,那么需要申請新空間。刪除操作和插入操作正好相反。
緩存系統(tǒng)中的元數(shù)據(jù)會(huì)保留多個(gè)副本,副本有master及slave之分,master完成數(shù)據(jù)的寫操作,并同步給slave,這種副本間的數(shù)據(jù)同步是通過異步方式實(shí)現(xiàn)的。雖然不是實(shí)時(shí)同步,但也可以在保證系統(tǒng)性能的前提下保證數(shù)據(jù)的一致性。副本間的同步有兩種方式:
(1)全量同步。slave節(jié)點(diǎn)把master節(jié)點(diǎn)的全部數(shù)據(jù)都復(fù)制過來。全量同步一般只有在新的slave節(jié)點(diǎn)加入緩存系統(tǒng)時(shí),才會(huì)給新的slave同步全量數(shù)據(jù)。
(2)增量同步。slave不主動(dòng)獲取全量數(shù)
據(jù),而是只有在數(shù)據(jù)出現(xiàn)變化時(shí)才只同步變化的數(shù)據(jù)。
對(duì)于整個(gè)緩存系統(tǒng)來說,當(dāng)用戶數(shù)量不斷增加時(shí)請求的數(shù)據(jù)也會(huì)越來越多,給緩存系統(tǒng)帶來的壓力也越來越大,此時(shí)可以采用數(shù)據(jù)讀寫分離的方式解決。當(dāng)請求發(fā)送到管理節(jié)點(diǎn)后,管理節(jié)點(diǎn)會(huì)根據(jù)請求操作類型進(jìn)行重定向:寫操作被重定向給master節(jié)點(diǎn),讀操作被重定向給slave節(jié)點(diǎn)。
4總結(jié)
Web目前已經(jīng)成為用戶接觸互聯(lián)網(wǎng)絡(luò)的首選,在訪問用戶急劇增加時(shí),Web服務(wù)器的響應(yīng)速度會(huì)越來越慢。為了提高Web服務(wù)的響應(yīng)能力,緩存機(jī)制應(yīng)運(yùn)而生。Memcached是開源的分布式緩存產(chǎn)品,可以有效提高web服務(wù)的響應(yīng)速度。
參考文獻(xiàn)
[1]顧榮慶,楊開杰,徐汀榮.分布式數(shù)據(jù)緩存技術(shù)研究[J].計(jì)算機(jī)應(yīng)用與軟件,2017,14(05):135-137.
[2]D. Karger, E. Lehman, T. Leighton,et al. Consistent Hashing and RandomTrees: Distributed Caching Protocolsfor Relieving Hot Spots on theWorld Wide Web[C]. Twenty-Ninth ACMSymposium on Theory of Computing.ACM, 2017: 654-663.
[3]陳麗冰,基于J2EE的Web應(yīng)用系統(tǒng)的性能優(yōu)化方法研究[J].計(jì)算機(jī)科學(xué),2015(08):13-16.
[4]鄧世權(quán)?;贛emcached的高速緩存功能擴(kuò)展研究[D].成都:西南交通大學(xué),2012.