1. 程式人生 > >使用Memcached改進Java企業級應用性能:架構和設置

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

利用 簡單的 數據 ref 壓縮文件 查找 停止 font tran

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企業級應用性能:架構和設置