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