Martin Brown 成為專業(yè)作家已有七年多的時間了。他是題材廣泛的眾多書籍和文章的作者。他的專業(yè)技術(shù)涉及各種開發(fā)語言和平臺 —— Perl、Python、Java™、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、 Shellscript、Windows、Solaris、Linux®、BeOS、Mac OS/X 等等,還涉及 Web 編程、系統(tǒng)管理和集成。Martin 是 Microsoft® 的主題專家(SME),并且是 ServerWatch.com、LinuxToday.com 和 IBM developerWorks 的定期投稿人,他還是 Computerworld、The Apple Blog 和其他站點的正式博客。您可以通過他的 Web 站點 :
http://www.mcslp.com 與他聯(lián)系。
簡介: 開源 memcached 工具是一個用來存儲常用信息的緩存,有了它,您便無需從緩慢的資源,比如磁盤或數(shù)據(jù)庫,加載(并處理)信息了。該工具可部署在專用的情況下,也可作為用完 現(xiàn)有環(huán)境內(nèi)的多余內(nèi)存的一種方法。盡管 memcached 十分簡便,但有時它仍被不當使用,或被用在錯誤的環(huán)境類型中。在本文中,了解使用 memcached 的最佳時機。
memcached 常被用來加速應(yīng)用程序的處理,在這里,我們將著重于介紹將它部署于應(yīng)用程序和環(huán)境中的最佳實踐。這包括應(yīng)該存儲或不應(yīng)存儲哪些、如何處理數(shù)據(jù)的靈活分布以 及如何調(diào)節(jié)用來更新 memcached 和所存儲數(shù)據(jù)的方法。我們還將介紹對高可用性的解決方案的支持,比如 IBM WebSphere® eXtreme Scale。
所有的應(yīng)用程序,特別是很多 web 應(yīng)用程序都需要優(yōu)化它們訪問客戶機和將信息返回至客戶機的速度。可是,通常,返回的都是相同的信息。從數(shù)據(jù)源(數(shù)據(jù)庫或文件系統(tǒng))加載數(shù)據(jù)十分低效,若是每次想要訪問該信息時都運行相同的查詢,就尤顯低效。
雖然很多 web 服務(wù)器都可被配置成使用緩存發(fā)回信息,但那與大多數(shù)應(yīng)用程序的動態(tài)特性無法相適。而這正是 memcached 的用武之地。它提供了一個通用的內(nèi)存存儲器,可保存任何東西,包括本地語言的對象,這就讓您可以存儲各種各樣的信息并可以從諸多的應(yīng)用程序和環(huán)境訪問這些信息。
memcached 是一個開源項目,旨在利用多個服務(wù)器內(nèi)的多余 RAM 來充當一個可存放經(jīng)常被訪問信息的內(nèi)存緩存。這里的關(guān)鍵是使用了術(shù)語緩存:memcached 為加載自他處的信息提供的是內(nèi)存中的暫時存儲。
比如,考慮這樣一個典型的基于 web 的應(yīng)用程序。即便是一個動態(tài)網(wǎng)站可能也會有一些組件或信息常量是貫穿頁面整個生命周期的。在一個博客站點內(nèi),針對單個 blog post 的類別列表不大可能在頁面查看間經(jīng)常性地變更。每次都通過一個對數(shù)據(jù)庫的查詢加載此信息相對比較昂貴,特別是在數(shù)據(jù)沒有更改的情況下,就更是如此。從圖 1 可以看到一個博客站點內(nèi)可被緩存的頁面分區(qū)。
圖 1. 一個典型的博客頁面內(nèi)的可緩存元素
將這種結(jié)構(gòu)放在 blog 站點的其他元素,poster 信息、注釋 — 設(shè)置 blog post 本身 — 進行推斷,可以看出為了顯示主頁的內(nèi)容很可能需要發(fā)生 10-20 次數(shù)據(jù)庫查詢和格式化。 每天對數(shù)百甚至數(shù)千的的頁面查看重復(fù)此過程,那么您的服務(wù)器和應(yīng)用程序執(zhí)行的查詢要遠遠多于為了顯示頁面內(nèi)容所需執(zhí)行的查詢。
通過使用 memcached,可以將加載自數(shù)據(jù)庫的格式化信息存儲為一種可直接用在 Web 頁面上的格式。并且由于信息是從 RAM 而不是通過數(shù)據(jù)庫和其他處理從磁盤加載的,所以對信息的訪問幾乎是瞬時的。
再強調(diào)一下,memcached 是一個用來存儲常用信息的緩存,有了它,您便無需從緩慢的資源,比如磁盤或數(shù)據(jù)庫,加載并處理信息了。
對 memcached 的接口是通過網(wǎng)絡(luò)連接提供的。這意味著您可以在多個客戶機間共享單個的 memcached 服務(wù)器(或多個服務(wù)器,如本文稍后所示的)。這個網(wǎng)絡(luò)接口非常迅速,并且為了改善性能,服務(wù)器會故意不支持身份驗證或安全性通信。但這不應(yīng)限制部署選項。 memcached 服務(wù)器應(yīng)該存在于您網(wǎng)絡(luò)的內(nèi)部。網(wǎng)絡(luò)接口的實用性以及可以部署多個 memcached 實例的簡便性讓您可以使用多個機器上的多余 RAM 來提高您緩存的整體大小。
memcached 的存儲方法是一個簡單的鍵/值對,類似于很多語言內(nèi)的散列或關(guān)聯(lián)數(shù)組。通過提供鍵和值來將信息存儲到 memcached 內(nèi),通過按特定的鍵請求信息來恢復(fù)信息。
信息會無限期地保留在緩存內(nèi),除非發(fā)生如下的情況:
- 為緩存分配的內(nèi)存耗盡 — 在這種情況下,memcached 使用 LRU(最近最少使用)方法從此緩存刪除條目。最近未曾使用的條目會從此緩存中先刪除,最舊的最先訪問。
- 條目被明確刪除 — 總是可以從此緩存內(nèi)刪除條目。
- 條目過期失效 — 各條目均有一個有效的期限以便針對此鍵存儲的信息在過于陳舊時可從緩存中清除這些條目。
上述這些情況可以與您應(yīng)用程序的邏輯綜合使用以便確保緩存內(nèi)的信息是最新的。有了這些基礎(chǔ)知識后,讓我們來看看在應(yīng)用程序內(nèi)如何能最好地利用 memcached。
在使用 memcached 改進應(yīng)用程序性能時,可以對一些關(guān)鍵的過程和步驟進行修改。
在加載信息時,典型的場景如圖 2 所示。
圖 2. 加載要顯示的信息的典型順序
一般而言,這些步驟是:
- 執(zhí)行一個或多個查詢來從數(shù)據(jù)庫加載信息
- 格式化適合于顯示(或進一步處理)的信息
- 使用或顯示格式化了的數(shù)據(jù)
在使用 memcached 時,為配合這個緩存,可對應(yīng)用程序的邏輯進行稍許修改:
- 盡量從緩存加載信息
- 如果存在,使用信息的被緩存版本
- 如果它不存在:
- 執(zhí)行一個或多個查詢來從數(shù)據(jù)庫加載信息
- 格式化適合于顯示或進一步處理的信息
- 將信息存儲到緩存內(nèi)
- 使用格式化了的數(shù)據(jù)
圖 3 是對這些步驟的總結(jié)。
圖 3. 在使用 memcached 時加載適合于顯示的信息
數(shù)據(jù)加載成為了至多三個步驟的一個過程,從緩存加載數(shù)據(jù)或從數(shù)據(jù)庫(視情況而定)加載數(shù)據(jù)并存儲在緩存內(nèi)。
當這個過程首次發(fā)生時,數(shù)據(jù)將正常地從數(shù)據(jù)庫或其他數(shù)據(jù)源加載,然后再存儲到 memcached 內(nèi)。當下一次訪問此信息時,它就會從 memcached 拉出,而不是從數(shù)據(jù)庫加載,節(jié)省了時間和 CPU 循環(huán)。
問題的另一個方面是要確保如果更改了要存儲在 memcached 內(nèi)的信息,在更新后端信息的同時還要更新 memcached 的版本。這會讓圖 4 內(nèi)所示的這個典型順序發(fā)生稍許變化,如 圖 5 所示。
圖 4. 在一個典型的應(yīng)用程序內(nèi)更新或存儲數(shù)據(jù)
圖 5 顯示了使用 memcached 后發(fā)生了變化的流程。
圖 5. 在使用 memcached 時更新或存儲數(shù)據(jù)
比如,仍以博客站點為例,在博客系統(tǒng)更新數(shù)據(jù)庫內(nèi)的類別列表時,更新應(yīng)該遵循如下順序:
- 更新數(shù)據(jù)庫內(nèi)的類別列表
- 格式化信息
- 將信息存儲到 memcached 內(nèi)
- 將信息返回至客戶機
memcached 內(nèi)的存儲操作是原子的,所以信息的更新不會讓客戶機只獲得部分數(shù)據(jù);它們獲得的或者是老版本,或者是新版本。
對于大多數(shù)應(yīng)用程序,這兩個操作是您惟一需要注意的。在訪問他人使用的數(shù)據(jù)時,它會自動被添加到這個緩存內(nèi),而且如果對該數(shù)據(jù)進行了更改,此緩存內(nèi)也會自動進行更新。
memcached 另一個需要重點考慮的因素是如何組織和命名存儲在緩存內(nèi)的這些數(shù)據(jù)。從之前博客站點的例子中,不難看出需要使用一種一致的命名結(jié)構(gòu)以便您能加載博客類別、歷史和其他信息,然后再在加載信息(并更新緩存)時或者在更新數(shù)據(jù)(同樣也要更新緩存)時使用。
使用的何種具體的命名系統(tǒng)特定于應(yīng)用程序,但通常可以使用一種與現(xiàn)有應(yīng)用程序類似的結(jié)構(gòu),并且這種結(jié)構(gòu)很可能基于某種惟一識別符。當從數(shù)據(jù)庫拉出信息或在整理信息集時,就會發(fā)生這種情況。
以 blog post 為例,可以在一個具有鍵 category-list
的項中存儲類別列表。與此 post ID 對應(yīng)的單個 post,比如 blogpost-29
相關(guān)的值都可以使用,而該項的注釋則可以存儲在 blogcomments-29
內(nèi),其中 29 就是這個 blog post 的 ID。這樣一來, 您就可以將各種各樣的信息存儲在緩存內(nèi),使用不同的前綴來標識這些信息。
memcached 鍵/值存儲的簡便性(以及安全性的缺乏)意味著如果您想要在使用同一個 memcached 服務(wù)器的同時支持多個應(yīng)用程序,那么就可以考慮使用其他格式的量詞來標識數(shù)據(jù)屬于某種特定的應(yīng)用程序。比如,可以添加像 blogapp:blogpost-29
這樣的應(yīng)用程序前綴。這些鍵是沒有格式的,所以可以使用任何字符串作為鍵的名稱。
在存儲值的方面,應(yīng)該確保存儲在緩存內(nèi)的信息適合于您的應(yīng)用程序。比如,對于這個博客系統(tǒng),您可能想要存儲被博客應(yīng)用程序使用的對象以便格式化博客信息,而不是原始的 HTML。如果同一個基礎(chǔ)結(jié)構(gòu)用在應(yīng)用程序內(nèi)的多個地方,這一點更具實用性。
大多數(shù)語言的接口,包括 Java™、Perl、PHP 等,都能串行化語言對象以便存儲在 memcached 內(nèi)。這就讓您可以存儲并隨后從內(nèi)存存儲恢復(fù)全部對象,而不是在您的應(yīng)用程序內(nèi)手動重構(gòu)它們。 很多對象,或它們使用的結(jié)構(gòu),都基于某種散列或數(shù)組結(jié)構(gòu)。對于跨語言的環(huán)境,比如在 JSP 環(huán)境和 JavaScript 環(huán)境間共享相同信息,可以使用一種架構(gòu)中立的格式,比如 JavaScript Object Notation (JSON) 甚或 XML。
作為一種開源產(chǎn)品以及一種最初開發(fā)用來工作于現(xiàn)有開源環(huán)境內(nèi)的產(chǎn)品,memcached 受大量環(huán)境和平臺支持。與 memcached 服務(wù)器通信的接口有很多,并常常具有針對所有語言的多個實現(xiàn)。參見 參考資料 以獲得常用的庫和工具箱。
要列出所有受支持的接口和環(huán)境不太可能,但它們均支持 memcached 協(xié)議提供的基礎(chǔ) API。這些描述已經(jīng)被簡化并應(yīng)用在不同語言的上下文內(nèi),在這些語言中,使用不同的值可指示錯誤。主要的函數(shù)有:
get(key)
— 從存儲了特定鍵的 memcached 獲得信息。 如果鍵不存在,就返回錯誤。
set(key, value [, expiry])
— 使用緩存內(nèi)的標識符鍵存儲這個特定的值。如果鍵已經(jīng)存在,那么它就會被更新。期滿時間的單位為秒,并且如果值小于 30 天 (30*24*60*60),那么就用作相對時間,如果值大于 30 天,那么就用作絕對時間 (epoch)。
add(key, value [, expiry])
— 如果鍵不存在就將這個鍵添加到緩存內(nèi),如果鍵已經(jīng)存在就返回錯誤。如果您想要顯式地添加一個新鍵而又不會因它已經(jīng)存在而更新它,那么這個函數(shù)將十分有用。
replace(key, value [, expiry])
— 更新此特定鍵的值,如果鍵不存在就返回一個錯誤。
delete(key [, time])
— 從緩存中刪除此鍵/值對。如果您提供一個時間,那么添加具有此鍵的一個新值就會被阻塞這個特定的時期。超時讓您可以確保此值總是可以重新讀取自您的數(shù)據(jù)中心。
incr(key [, value]
) — 為特定的鍵增 1 或特定的值。只適用于數(shù)值。
decr(key [, value])
— 為特定的鍵減 1 或特定的值,只適用于數(shù)值。
flush_all
— 讓緩存內(nèi)的所有當前條目無效(或到期失效)。
比如,在 Perl 內(nèi),基本 set 操作可以如清單 1 所示的那樣處理。
清單 1. Perl 內(nèi)的基本 set 操作
use Cache::Memcached;
my $cache = new Cache::Memcached { 'servers' => [ 'localhost:11211', ], };
$cache->set('mykey', 'myvalue');
|
Ruby 內(nèi)的相同的基本操作如清單 2 所示。
清單 2. Ruby 內(nèi)的基本 set 操作
require 'memcache' memc = MemCache::new '192.168.0.100:11211'
memc["mykey"] = "myvalue"
|
在兩個例子中可以看到相同的基本結(jié)構(gòu):設(shè)置 memcached 服務(wù)器,然后分配或設(shè)置值。其他的接口也可用,包括適合于 Java 技術(shù)的那些接口,讓您可以在 WebSphere 應(yīng)用程序內(nèi)使用 memcached。memcached 接口類允許將 Java 對象直接序列化到 memcached 以便于存儲和加載復(fù)雜的結(jié)構(gòu)。當在像 WebSphere 這樣的環(huán)境內(nèi)進行部署時,有兩個事情非常重要:服務(wù)的彈性(在 memcached 不可用時如何做)以及如何提高緩存存儲量來改進在使用多個應(yīng)用程序服務(wù)器或在使用像 WebSphere eXtreme Scale 這樣的環(huán)境時的性能。我們接下來就來看看這兩個問題。
有關(guān) memcached 最常見的一個問題是:“若緩存不可用了,會發(fā)生什么情況呢?”正如之前章節(jié)中明示的,緩存內(nèi)的信息不應(yīng)該成為信息的的惟一資源。必須要能夠從其他位置加載存儲在緩存內(nèi)的數(shù)據(jù)。
雖然,無法從緩存訪問信息將會減緩應(yīng)用程序的性能,但它不應(yīng)該阻止應(yīng)用程序的運轉(zhuǎn)。可能會發(fā)生這樣幾個場景:
- 如果 memcached 服務(wù)宕掉,應(yīng)用程序應(yīng)該回退到從原始數(shù)據(jù)源加載信息并對信息進行顯示所需的格式化。此應(yīng)用程序還應(yīng)繼續(xù)嘗試在 memcached 內(nèi)加載和存儲信息。
- 一旦 memcached 服務(wù)器恢復(fù)可用,應(yīng)用程序就應(yīng)該自動嘗試存儲數(shù)據(jù)。沒有必要強制重載已緩存了的數(shù)據(jù),可以使用標準的訪問來用信息加載和填充緩存。最終,緩存將會被最常用的數(shù)據(jù)重新填充。
再次重申,memcached 是信息的緩存但并非惟一的數(shù)據(jù)源。memcached 服務(wù)器不可用不應(yīng)該是應(yīng)用程序的終結(jié),雖然這意味著在 memcached 服務(wù)器恢復(fù)正常之前性能會有所降低。實際上,memcached 服務(wù)器相對簡單,并且雖然不是絕對無故障的,但它的簡單性的結(jié)果就是它很少會出錯。
memcached 服務(wù)器只是網(wǎng)絡(luò)上針對一些鍵存儲值的一個緩存。如果有多臺機器,那么很自然地會想要在所有多余機器上設(shè)置一個 memcached 的實例來提供一個超大的聯(lián)網(wǎng) RAM 緩存存儲。
有了這個想法后,還有一種想當然是需要使用某種分配或復(fù)制機制來在機器之間復(fù)制鍵/值對。這種方式的問題是如果這么做反而會減少可用的 RAM 緩存,而不是增加。如圖 6 所示,可以看出這里有三個應(yīng)用程序服務(wù)器,每個服務(wù)器都可以訪問一個 memcached 實例。
圖 6. 多重 memcached 實例的不正確使用
盡管每個 memcached 實例都是 1 GB 的大小(產(chǎn)生 3 GB 的 RAM 緩存),但如果每個應(yīng)用程序服務(wù)器只有其自己的緩存(或者在 memcached 之間存在著數(shù)據(jù)的復(fù)制),那么整個安裝也仍只能有 1 GB 的緩存在每個實例間復(fù)制。
由于 memcached 通過一個網(wǎng)絡(luò)接口提供信息,因此單個的客戶機可以從它所能訪問的任何一個 memcached 實例訪問數(shù)據(jù)。如果數(shù)據(jù)沒有跨每個實例被復(fù)制,那么最終在每個應(yīng)用程序服務(wù)器上,就可以有 3 GB 的 RAM 緩存可用,如圖 7 所示。
圖 7. 多重 memcached 實例的正確使用
這個方法的問題是選擇哪個服務(wù)器來儲存鍵/值對,以及當想要重新獲得一個值時,如何決定要與哪個 memcached 服務(wù)器對話。問題的解決方案就是忽略復(fù)雜的東西,比如查找表,或是寄望 memcached 服務(wù)器來為您處理這個過程。而 memcached 客戶機則必須要力求簡單。
memcached 客戶機不必決定此信息,它只需對在存儲信息時指定的鍵使用一個簡單的散列算法。當想要從一列 memcached 服務(wù)器存儲或獲取信息時,memcached 客戶機就會用一個一致的散列算法從這個鍵獲取一個數(shù)值。舉個例子,鍵 mykey
被轉(zhuǎn)換成數(shù)值 23875
。是保存還是獲取信息無關(guān)緊要,這個鍵將總是被用作惟一標識符來從 memcached 服務(wù)器加載,因此在本例中,“mykey” 散列轉(zhuǎn)化后對應(yīng)的值總是 23875
。
如果有兩個服務(wù)器,那么 memcached 客戶機將對這個數(shù)值進行一個簡單的運算(例如,系數(shù))來決定它應(yīng)將此值存儲在第一個還是第二個配置了的 memcached 實例上。
當存儲一個值時,客戶機會從這個鍵確定出散列值以及它原來存儲在哪個服務(wù)器上。當獲取一個值時,客戶機會從這個鍵確定出相同的散列值并會選擇相同的服務(wù)器來獲取信息。
如果在每個應(yīng)用程序服務(wù)器上使用的是相同的服務(wù)器列表(并且順序相同),那么當需要保存或檢索同一個鍵時,每個應(yīng)用程序服務(wù)器都將選擇同一個 服務(wù)器。現(xiàn)在,在這個例子中,有 3GB 的 memcached 空間可以共享,而不是同一個 1 GB 的空間的復(fù)制,這就帶來了更多的可用緩存,并很有可能會提高有多個用戶情況下的應(yīng)用程序的性能。
這個過程也有其復(fù)雜性(比如當一個服務(wù)器不可用時會怎樣),更多信息,請參見相關(guān)文檔(參見 參考資料)。
盡管 memcached 很簡單,但 memcached 實例有時候還是會被不正確地使用。
最常見的 memcached 誤用就是把它用作一個數(shù)據(jù)存儲,而不是一個緩存。memcached 的首要目的就是加快數(shù)據(jù)的響應(yīng)時間,否則數(shù)據(jù)從其他數(shù)據(jù)源構(gòu)建或恢復(fù)需要很長時間。一個典型的例子就是從一個數(shù)據(jù)庫中恢復(fù)信息,特別是在信息顯示給用戶前 需要對信息進行格式化或處理的時候。Memcached 被設(shè)計用來將信息存儲在內(nèi)存中以避免每次在數(shù)據(jù)需要恢復(fù)時重復(fù)執(zhí)行相同的任務(wù)。
切不可將 memcached 用作運行應(yīng)用程序所需信息的惟一信息源;數(shù)據(jù)應(yīng)總是可以從其他信息源獲取。此外,要記住 memcached 只是一個鍵/值的存儲。不能在數(shù)據(jù)上執(zhí)行查詢,或者對內(nèi)容進行迭代來提取信息。應(yīng)該使用它來存儲數(shù)據(jù)塊或?qū)ο笠詡渑渴褂谩?/p>
雖然可以使用 memcached 存儲加載自數(shù)據(jù)庫的數(shù)據(jù)行,但這實際上是查詢緩存,并且大多數(shù)數(shù)據(jù)庫都提供各自的查詢緩存的機制。其他的對象,比如文件系統(tǒng)的圖像或文件的情況與此相同。很多應(yīng)用程序和 web 服務(wù)器針對此類工作已經(jīng)有了一些很好的解決方案。
如果在加載和格式化后,使用它來存儲全部信息塊,就可以從 memcached 獲得更多的實用工具和性能上的改善。仍以我們的博客站點為例,存儲信息的最佳點是在將博客類別格式化為對象,甚至是在格式化成 HTML 后。博客頁面的構(gòu)造可通過從 memcached 加載各個組件(比如 blog post、category list、post history 等)并將完成的 HTML 寫回至客戶機實現(xiàn)。
為了確保最佳性能,memcached 并未提供任何形式的安全性,沒有身份驗證,也沒有加密。這意味著對 memcached 服務(wù)器的訪問應(yīng)該這么處理:一是通過將它們放到應(yīng)用程序部署環(huán)境相同的私有側(cè),二是如果安全性是必須的,那么就使用 UNIX® socket 并只允許當前主機上的應(yīng)用程序訪問此 memcached 服務(wù)器。
這多少犧牲了一些靈活性和彈性,以及跨網(wǎng)絡(luò)上的多臺機器共享 RAM 緩存的能力,但這是在目前的情況下確保 memcached 數(shù)據(jù)安全性的惟一一種解決方案。
除了不應(yīng)該使用 memcached 實例的情況外,memcached 的靈活性不應(yīng)忽視。由于 memcached 與應(yīng)用程序處于相同的架構(gòu)水平,所以很容易集成并連接到它。并且更改應(yīng)用程序以便利用 memcached 也并不復(fù)雜。此外,由于 memcached 只是一個緩存,所以在出現(xiàn)問題時它不會停止應(yīng)用程序的執(zhí)行。如果使用正確的話,它所做的是減輕其余服務(wù)器基礎(chǔ)設(shè)施的負載(減少對數(shù)據(jù)庫和數(shù)據(jù)源的讀操 作),這意味著無需更多的硬件就可以支持更多的客戶機。
但請記住,它僅僅是個緩存!
在本文中,我們了解了 memcached 以及如何最佳地使用它。我們看到了信息如何存儲、如何選擇合理的鍵以及如何選擇要存儲的信息。我們還討論了所有 memcached 用戶都要遇到的一些關(guān)鍵的部署問題,包括多服務(wù)器的使用、當 memcached 實例消亡時該怎么做,以及(也許最為重要的)在哪些情況下不能使用 memcached。
作為一種開源的應(yīng)用程序并且是目的簡單而直白的應(yīng)用程序,memcached 的功能和實用性均來自于這種簡單性。通過為信息提供巨大的 RAM 存儲空間、讓它在網(wǎng)絡(luò)上可用,然后再讓它可通過各種不同的接口和語言訪問到,memcached 可被集成到多種多樣的安裝和環(huán)境中。
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
Martin Brown 成為專業(yè)作家已有七年多的時間了。他是題材廣泛的眾多書籍和文章的作者。他的專業(yè)技術(shù)涉及各種開發(fā)語言和平臺 —— Perl、Python、Java™、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、 Shellscript、Windows、Solaris、Linux®、BeOS、Mac OS/X 等等,還涉及 Web 編程、系統(tǒng)管理和集成。Martin 是 Microsoft® 的主題專家(SME),并且是 ServerWatch.com、LinuxToday.com 和 IBM developerWorks 的定期投稿人,他還是 Computerworld、The Apple Blog 和其他站點的正式博客。您可以通過他的 Web 站點 : http://www.mcslp.com 與他聯(lián)系。
轉(zhuǎn)自:http://www.ibm.com/developerworks/cn/opensource/os-memcached