標籤:arc 關閉 架構 序列化 target map對象 資料庫 佔用 服務
Memcached由Danga Interactive開發。用來提升LiveJournal.com網站效能。
Memcached分布式架構支援眾多的社交網路應用,Twitter、Facebook還有Wikipedia。
在接下來的兩部分教程中,Sunil Patil介紹了Memcached分布式雜湊表架構,以及利用它協助你為資料驅動Java公司專屬應用程式做資料緩衝。
本文介紹了怎樣利用Memcached提升Java公司專屬應用程式效能。
首先,總覽了傳統的Java緩衝架構。並和Memcached做一個比較。當然。也會在你的本機上安裝Memcached,怎樣通過telnet與Memcached互動工作。
接著,建立一個”Hello Memcached”Javaclient程式。你會瞭解怎樣利用Memcached降低資料庫server負載,緩衝動態產生的頁面標記。最後,考慮對spymemcachedclient做一些進階最佳化配置。
Memcached以及Java緩衝架構總覽
像EHCache和OSCache這種Java緩衝架構,本質上是存在於應用代碼中的HashMap對象。不管何時加入一個新的對象到緩衝中,它都儲存在你的應用記憶體中。儲存少量資料時。這個策略是沒有問題的,但緩衝超過GB的資料就有問題了。Memcachedserver的設計者採用一種分布式架構,這種方式便於擴充,因此。能夠利用Memcached做海量資料緩衝。
Memcached架構包括兩部分。首先是一個擁有自身進程的Memcachedserver軟體。倘若你想擴充你的應用,能夠在其他機器上執行Memcachedserver軟體。Memcachedserver軟體執行個體相互獨立。Memcached系統的第二部分是Memcachedclient,它確切地知道每台server的存在。client負責擷取緩衝錄入相應的server,以及儲存或者獲得緩衝錄入——這一過程,稍後我會做具體地討論。
假設以前開發過Java EE 網路應用,你一定用過EHCache或者OSCache之類的Java開源緩衝架構。你也許用過DynaCache或者JBoss Cache這種商業緩衝架構作為應用server的一部分。
在我們親手實踐本教程之前,明確Memcached與那些傳統Java緩衝架構的不同之處是非常重要的。
使用傳統的Java緩衝
不管選擇開源或者是商業方案,使用傳統Java緩衝架構是非常easy。
使用類似EHCache或者OSCache這樣的開源的架構。你須要下載二進位檔案。加入必須的JAR檔案到你的應用classpath下。相同,你須要建立設定檔,配置緩衝、交換分區的大小。因為緩衝架構須要與軟體綁定。而緩衝架構一般會與應用server綁定,所以無需下載不論什麼額外的JAR檔案。
圖1 傳統的Java緩衝架構
在為你的應用程式加入緩衝架構之後,通過建立CacheManager對象擷取和設定當中的緩衝條目(entry)。
這樣。你的應用和緩衝架構建立的CacheManager會在同樣的JVM上執行。
每次添加緩衝條目,此對象會加入到由緩衝架構維護某類雜湊表中。
一旦你的應用server軟體執行在多個節點上,你可能須要支援分布式緩衝。在分布式緩衝系統中。一旦在AppServer1中加入了某個對象,在AppServer2和AppServer3上此對象也變為可用。傳統的Java緩衝使用複製(replication)實現分布式緩衝,這意味著當你為AppServer1加入一個緩衝條目,該條目會自己主動拷貝到系統的其他應用server上。
終於,條目會在全部的網站中可用。
使用Memcached
要使用Memcached進行緩衝,必須下載並在你的平台上安裝Memcachedserver軟體。一旦Memcachedserver成功安裝。它會通過TCP或者UDPport監聽緩衝調用。
圖2 Memcached架構
接著,下載一個JavaMemcachedclient,把clientJAR檔案加入到你的應用中。
然後建立一個Memcachedclient對象,就能夠調用它的方法擷取和設定緩衝條目。
一旦加入某個對象到緩衝中。Memcachedclient會擷取該對象、對其序列化並發送位元組數組到Memcached服務端儲存。這時。緩衝對象可能被應用執行的JVM作為記憶體回收。
當你須要緩衝對象時,能夠調用Memcachedclient的 get() 方法。client會得到這個get請求、序列化並將get請求傳給Memcachedserver。Memcachedserver通過該請求從緩衝中尋找這個對象。假設存有此對象。server會把這個位元組數組返回給client。client收到位元組數組,還原序列化並建立對象返回給你的應用。
即使你的應用跑在不止一個應用server上。全部的應用都能指向相同的Memcachedserver,通過它擷取並設定緩衝條目。
倘若你擁有不止一台Memcachedserver,server互相之間不會知道。
因此,你須要配置Memcachedclient。這樣它就能知道全部Memcachedserver。比方,應用在AppServer1建立一個Java對象,接著調用Memcached的 set() 方法,Memcachedclient就找到某個Memcachedserver來存放條目。接著它僅僅和此台Memcachedserver通訊。
相同,一旦存在於AppServer2或者Appserver3的代碼嘗試去擷取某個錄入時。Memcachedclient首先會找出哪個server儲存了此條目,接著僅僅與此server通訊。
Memcachedclient邏輯
在預設狀態下。Memcachedclient使用很easy的邏輯選擇server進行get或set操作。
一旦調用get()或者set(),client就會得到緩衝鍵(key)調用hashcode()方法得到整數值,比方11。
接著用這個數除以Memcachedserver可用數量(比方2),本例中得到的餘數為1。緩衝條目就會指向Memcachedserver1。這個簡單的算能夠確保應用server所在的Memcachedclient為給定的緩衝鍵選擇同樣的server。
Memcached安裝
Memcached能夠執行在Unix、Linux、windows以及MacOSX上。你能夠下載Memcached原始碼編譯,或者直接下載編譯好的二進位檔案安裝Memcached。
這裡我會展示為特定平台下載二進位檔案的安裝過程。假設你更傾向於編譯。請參見這裡。
接下來的安裝指令針對Windows XP 32位機器。若平台是linux等其他平台,查看這裡。注意本文案例代碼是在Windows XP 32位機器上開發的,只是是能夠在其他平台上執行。
- Jellycan code是一個Memcached修訂版本號碼,更易用更有效。我們先從下載win32二進位壓縮檔開始。
- 解壓Memcached-<versionnumber>-win32-bin.zip,注意裡麵包括memcached.exe。運行此檔案完畢server搭建。
- 使用 memcached.exe -d install 注冊memcached.exe作為系統服務,你能夠在服務控制台開啟或者停止Memcachedserver。
當你在預設狀態下執行memcached.exe。Memcachedserver預設佔用64兆記憶體,監聽11211port。在某些情形下,也許你想做一些更加細粒度的控制。比方,port11211被本機其它進程佔用,你希望Memcached能夠監聽port12000;或者你想在品質保證或者生產環境中搭建Memcachedserver,須要的預設記憶體不止64兆。
你能夠通過命令列參數定製server行為。執行memcache.exe -help命令會擷取全部的命令列選項,例如以3所看到的。
圖3 Memcachedserver命令列選項
通過Telnet與Memcached互動
一旦Memcachedserver開始監聽你指定的port,Memcachedclient就能夠通過TCP或者UDPport與之串連,發送命令或者接受響應,最後關閉串連。
串連Memcachedserver方式有多種,我會在本教程的第二部分採用Javaclient串連,你將可以利用簡單的API從緩衝中儲存或者擷取對象。或者你可以採用Telnetclient直接與server串連。懂得利用Telnetclient與Memcachedserver互動對調試Javaclient非常重要。因此我們就從這裡開始。
Telnet命令
首先你須要用Telnetclient串連Memcachedserver。在WindowsXP平台上,假設Memcachedserver也執行在這台機器上並預設監聽port11211,僅僅要執行telnet localhost 11211。接下來的命令對Telnet管理Memcached非常重要:
- set加入一個新的項目到緩衝中,使用格式是 Set <keyName> <flags> <expiryTime> <bytes>,你能夠將敲入的值存入下一行。倘若不想緩衝錄入到期,能夠輸入0。
- get返回緩衝鍵的值,調用get <keyName>獲得keyName的值。
- add加入一個新的鍵,前提是此鍵之前並不存在。比方add <keyName> <flags> <expiryTime> <bytes>。
- replace會替代某個鍵的值,前提是此鍵已存在。比方replace <keyName> <flags> <expiryTime> <bytes>。
- delete刪除某個鍵的緩衝錄入,調用delete <keyName>刪除keyName的值。
圖4的展示了通過Telnet與Memcachedserver互動案例。正如你所示,Memcachedserver會對每一個命令做出回應,比方STORED、NOT_STORED等。
圖4 Telnetclient與Memcachedserver互動案例
第一部分結語
到此。我們簡要地討論了Memcached分布式架構和眾多傳統Java緩衝系統。
在你的開發環境中安裝了Memcached,通過Telnet串連Memcached。
教程的下一篇中,我們將調用Javaclientsypmemcached命令,為一個Java示範範例應用建立分布式緩衝方案。在此過程中。你會瞭解很多其它關於Memcached的資訊,以及怎樣提升你的JavaEE應用效能。
使用Memcached改進Java企業級應用效能:架構和設定