使用Memcached改進Java企業級應用性能(1):架構和設置
Memcached由Danga Interactive開發,用來提升LiveJournal.com網站性能。Memcached分布式架構支持眾多的社交網絡應用,推ter、非死book還有Wikipedia。在接下來的兩部分教程中,Sunil Patil介紹了Memcached分布式哈希表架構,以及利用它幫助你為數據驅動Java企業應用做數據緩存。
本文介紹了如何利用Memcached提升Java企業應用性能。首先,總覽了傳統的Java緩存框架,并和Memcached做一個比較。當然,也會在你的本機上安裝Memcached,如何通過telnet與Memcached交互工作。接著,創建一個”Hello Memcached”Java客戶端程序。你會了解如何利用Memcached減少數據庫服務器負載,緩存動態生成的頁面標記。最后,考慮對spymemcached客戶端做一些高級優化配置。
Memcached以及Java緩存架構總覽
像EHCache和OSCache這樣的Java緩存框架,本質上是存在于應用代碼中的HashMap對象。無論何時添加一個新的對象到緩存中,它都保存在你的應用內存中。保存少量數據時,這個策略是沒有問題的,但緩存超過GB的數據就有問題了。Memcached服務器的設計者采用一種分布式架構,這種方式便于擴展,因此,可以利用Memcached做海量數據緩存。
Memcached架構包含兩部分。首先是一個擁有自身進程的Memcached服務器軟件。倘若你想擴展你的應用,可以在其它機器上運行Memcached服務器軟件。Memcached服務器軟件實例相互獨立。Memcached系統的第二部分是Memcached客戶端,它確切地知道每臺服務器的存在。客戶端負責獲取緩存錄入對應的服務器,以及存儲或者獲得緩存錄入——這一過程,稍后我會做詳細地討論。
如果曾經開發過Java EE 網絡應用,你一定用過EHCache或者OSCache之類的Java開源緩存框架。你或許用過DynaCache或者JBoss Cache這樣的商業緩存框架作為應用服務器的一部分。在我們親手實踐本教程之前,明白Memcached與那些傳統Java緩存框架的不同之處是很重要的。
使用傳統的Java緩存
無論選擇開源或者是商業方案,使用傳統Java緩存架構是很容易。使用類似EHCache或者OSCache這種開源的框架,你需要下載二進制文件,添加必須的JAR文件到你的應用classpath下。同樣,你需要創建配置文件,配置緩存、交換分區的大小。由于緩存框架需要與軟件綁定,而緩存框架通常會與應用服務器綁定,所以無需下載任何額外的JAR文件。
在為你的應用程序添加緩存框架之后,通過創建CacheManager對象獲取和設置其中的緩存條目(entry)。這樣,你的應用和緩存框架創建的CacheManager會在相同的JVM上運行。每次增加緩存條目,此對象會添加到由緩存框架維護某類哈希表中。
一旦你的應用服務器軟件運行在多個節點上,你可能需要支持分布式緩存。在分布式緩存系統中,一旦在AppServer1中添加了某個對象,在AppServer2和AppServer3上此對象也變為可用。傳統的Java緩存使用復制(replication)實現分布式緩存,這意味著當你為AppServer1添加一個緩存條目,該條目會自動復制到系統的其它應用服務器上。最終,條目會在所有的站點中可用。
使用Memcached
要使用Memcached進行緩存,必須下載并在你的平臺上安裝Memcached服務器軟件。一旦Memcached服務器安裝成功,它會通過TCP或者UDP端口監聽緩存調用。
接著,下載一個JavaMemcached客戶端,把客戶端JAR文件添加到你的應用中。然后創建一個Memcached客戶端對象,就可以調用它的方法獲取和設置緩存條目。一旦添加某個對象到緩存中,Memcached客戶端會獲取該對象、對其序列化并發送字節數組到Memcached服務端保存。這時,緩存對象可能被應用運行的JVM作為垃圾回收。
當你需要緩存對象時,可以調用Memcached客戶端的 get() 方法。客戶端會得到這個get請求、序列化并將get請求傳給Memcached服務器。Memcached服務器通過該請求從緩存中查找這個對象。如果存有此對象,服務器會把這個字節數組返回給客戶端。客戶端收到字節數組,反序列化并創建對象返回給你的應用。
即使你的應用跑在不止一個應用服務器上,所有的應用都能指向相同的Memcached服務器,通過它獲取并設置緩存條目。倘若你擁有不止一臺Memcached服務器,服務器互相之間不會知道。因此,你需要配置Memcached客戶端,這樣它就能知道所有Memcached服務器。比如,應用在AppServer1創建一個Java對象,接著調用Memcached的 set() 方法,Memcached客戶端就找到某個Memcached服務器來存放條目。接著它只和此臺Memcached服務器通信。同樣,一旦存在于AppServer2或者Appserver3的代碼嘗試去獲取某個錄入時,Memcached客戶端首先會找出哪個服務器存儲了此條目,接著只與此服務器通信。
Memcached客戶端邏輯
在缺省狀態下,Memcached客戶端使用非常簡單的邏輯選擇服務器進行get或set操作。一旦調用get()或者set(),客戶端就會得到緩存鍵(key)調用hashcode()方法得到整數值,比如11。接著用這個數除以Memcached服務器可用數量(比如2),本例中得到的余數為1。緩存條目就會指向Memcached服務器1。這個簡單的算可以確保應用服務器所在的Memcached客戶端為給定的緩存鍵選擇相同的服務器。
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,執行此文件完成服務器搭建。
- 使用 memcached.exe -d install 注冊memcached.exe作為系統服務,你可以在服務控制臺開啟或者停止Memcached服務器。 </ol>
- 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的值。 </ul>
當你在缺省狀態下執行memcached.exe,Memcached服務器默認占用64兆內存,監聽11211端口。在某些情形下,或許你想做一些更加細粒度的控制。比如,端口11211被本機其他進程占用,你希望Memcached可以監聽端口12000;或者你想在質量保證或者生產環境中搭建Memcached服務器,需要的默認內存不止64兆。你可以通過命令行參數定制服務器行為。運行memcache.exe -help命令會獲取所有的命令行選項,如下圖3所示。
通過Telnet與Memcached交互
一旦Memcached服務器開始監聽你指定的端口,Memcached客戶端就可以通過TCP或者UDP端口與之連接,發送命令或者接受響應,最后關閉連接。
連接Memcached服務器方式有多種,我會在本教程的第二部分采用Java客戶端連接,你將能夠利用簡單的API從緩存中存儲或者獲取對象。或者你可以采用Telnet客戶端直接與服務器連接。懂得利用Telnet客戶端與Memcached服務器交互對調試Java客戶端很重要,因此我們就從這里開始。
Telnet命令
首先你需要用Telnet客戶端連接Memcached服務器。在WindowsXP平臺上,如果Memcached服務器也運行在這臺機器上并缺省監聽端口11211,只要執行telnet localhost 11211。接下來的命令對Telnet管理Memcached很重要:
圖4的截圖展示了通過Telnet與Memcached服務器交互案例。正如你所看到的,Memcached服務器會對每個命令做出回應,比如STORED、NOT_STORED等。
第一部分結語
到此,我們簡要地討論了Memcached分布式框架和眾多傳統Java緩存系統。在你的開發環境中安裝了Memcached,通過Telnet連接Memcached。教程的下一篇中,我們將調用Java客戶端sypmemcached命令,為一個Java示例應用建立分布式緩存方案。在此過程中,你會了解更多關于Memcached的信息,以及如何提升你的JavaEE應用性能。
原文鏈接: javaworld 翻譯: ImportNew.com - 喬永琪譯文鏈接: http://www.importnew.com/16074.html