使用Memcached改進Java企業級應用效能:架構和設定

來源:互聯網
上載者:User

標籤: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位機器上開發的,只是是能夠在其他平台上執行。

  1. Jellycan code是一個Memcached修訂版本號碼,更易用更有效。我們先從下載win32二進位壓縮檔開始。
  2. 解壓Memcached-<versionnumber>-win32-bin.zip,注意裡麵包括memcached.exe。運行此檔案完畢server搭建。
  3. 使用 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企業級應用效能:架構和設定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.