<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_0">memcached是什麼?</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_1">memcached的特征</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_2">協定簡單</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_3">基于libevent的事件處理</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_4">内置記憶體存儲方式</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_5">memcached不互相通信的分布式</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_6">安裝memcached</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_7">memcached的安裝</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_8">memcached的啟動</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_9">用用戶端連接配接</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_10">使用Cache::Memcached</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_11">使用Cache::Memcached連接配接memcached</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_12">儲存資料</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_13">擷取資料</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_14">删除資料</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_15">增一和減一操作</a>
<a target="_blank" href="http://tech.idv2.com/2008/07/10/memcached-001/#content_2_16">總結</a>
許多Web應用都将資料儲存到RDBMS中,應用伺服器從中讀取資料并在浏覽器中顯示。但随着資料量的增大、通路的集中,就會出現RDBMS的負擔加重、資料庫響應惡化、網站顯示延遲等重大影響。
這時就該memcached大顯身手了。memcached是高性能的分布式記憶體緩存伺服器。一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态Web應用的速度、提高可擴充性。

圖1 一般情況下memcached的用途
memcached作為高速運作的分布式緩存伺服器,具有以下的特點。
協定簡單
基于libevent的事件處理
内置記憶體存儲方式
memcached不互相通信的分布式
memcached的伺服器用戶端通信并不使用複雜的XML等格式,而使用簡單的基于文本行的協定。是以,通過telnet 也能在memcached上儲存資料、取得資料。下面是例子。
協定文檔位于memcached的源代碼内,也可以參考以下的URL。
<a target="_blank" href="http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt">http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt</a>
libevent是個程式庫,它将Linux的epoll、BSD類作業系統的kqueue等事件處理功能封裝成統一的接口。即使對伺服器的連接配接數增加,也能發揮O(1)的性能。 memcached使用這個libevent庫,是以能在Linux、BSD、Solaris等作業系統上發揮其高性能。關于事件處理這裡就不再詳細介紹,可以參考Dan Kegel的The C10K Problem。
為了提高性能,memcached中儲存的資料都存儲在memcached内置的記憶體存儲空間中。由于資料僅存在于記憶體中,是以重新開機memcached、重新開機作業系統會導緻全部資料消失。另外,内容容量達到指定值之後,就基于LRU(Least Recently Used)算法自動删除不使用的緩存。 memcached本身是為緩存而設計的伺服器,是以并沒有過多考慮資料的永久性問題。關于記憶體存儲的詳細資訊,本連載的第二講以後前坂會進行介紹,請屆時參考。
memcached盡管是“分布式”緩存伺服器,但伺服器端并沒有分布式功能。各個memcached不會互相通信以共享資訊。那麼,怎樣進行分布式呢?這完全取決于用戶端的實作。本連載也将介紹memcached的分布式。
圖2 memcached的分布式
接下來簡單介紹一下memcached的使用方法。
memcached的安裝比較簡單,這裡稍加說明。
memcached支援許多平台。
Linux
FreeBSD
Solaris (memcached 1.2.5以上版本)
Mac OS X
另外也能安裝在Windows上。這裡使用Fedora Core 8進行說明。
運作memcached需要本文開頭介紹的libevent庫。Fedora 8中有現成的rpm包,通過yum指令安裝即可。
memcached的源代碼可以從memcached網站上下載下傳。本文執筆時的最新版本為1.2.5。 Fedora 8雖然也包含了memcached的rpm,但版本比較老。因為源代碼安裝并不困難,這裡就不使用rpm了。
memcached安裝與一般應用程式相同,configure、make、make install就行了。
預設情況下memcached安裝到/usr/local/bin下。
從終端輸入以下指令,啟動memcached。
這裡顯示了調試資訊。這樣就在前台啟動了memcached,監聽TCP端口11211 最大記憶體使用量為64M。調試資訊的内容大部分是關于存儲的資訊,下次連載時具體說明。
作為daemon背景啟動時,隻需
這裡使用的memcached啟動選項的内容如下。
選項
說明
-p
使用的TCP端口。預設為11211
-m
最大記憶體大小。預設為64M
-vv
用very vrebose模式啟動,調試資訊和錯誤輸出到控制台
-d
作為daemon在背景啟動
上面四個是常用的啟動選項,其他還有很多,通過
指令可以顯示。許多選項可以改變memcached的各種行為,推薦讀一讀。
許多語言都實作了連接配接memcached的用戶端,其中以Perl、PHP為主。僅僅memcached網站上列出的語言就有
Perl
PHP
Python
Ruby
C#
C/C++
Lua
等等。
這裡介紹通過mixi正在使用的Perl庫連結memcached的方法。
Perl的memcached用戶端有
Cache::Memcached
Cache::Memcached::Fast
Cache::Memcached::libmemcached
等幾個CPAN子產品。這裡介紹的Cache::Memcached是memcached的作者Brad Fitzpatric的作品,應該算是memcached的用戶端中應用最為廣泛的子產品了。
下面的源代碼為通過Cache::Memcached連接配接剛才啟動的memcached的例子。
在這裡,為Cache::Memcached指定了memcached伺服器的IP位址和一個選項,以生成執行個體。 Cache::Memcached常用的選項如下所示。
servers
用數組指定memcached伺服器和端口
compress_threshold
資料壓縮時使用的值
namespace
指定添加到鍵的字首
另外,Cache::Memcached通過Storable子產品可以将Perl的複雜資料序列化之後再儲存,是以散列、數組、對象等都可以直接儲存到memcached中。
向memcached儲存資料的方法有
add
replace
set 它們的使用方法都相同:
向memcached儲存資料時可以指定期限(秒)。不指定期限時,memcached按照LRU算法儲存資料。這三個方法的差別如下:
僅當存儲空間中不存在鍵相同的資料時才儲存
僅當存儲空間中存在鍵相同的資料時才儲存
set
與add和replace不同,無論何時都儲存
擷取資料可以使用get和get_multi方法。
一次取得多條資料時使用get_multi。get_multi可以非同步地同時取得多個鍵值,其速度要比循環調用get快數十倍。
删除資料使用delete方法,不過它有個獨特的功能。
删除第一個參數指定的鍵的資料。第二個參數指定一個時間值,可以禁止使用同樣的鍵儲存新資料。此功能可以用于防止緩存資料的不完整。但是要注意,set函數忽視該阻塞,照常儲存資料
可以将memcached上特定的鍵值作為計數器使用。
增一和減一是原子操作,但未設定初始值時,不會自動賦成0。是以,應當進行錯誤檢查,必要時加入初始化操作。而且,伺服器端也不會對超過2<sup>32</sup>時的行為進行檢查。
這次簡單介紹了memcached,以及它的安裝方法、Perl用戶端Cache::Memcached的用法。隻要知道,memcached的使用方法十分簡單就足夠了。
下次由前坂來說明memcached的内部結構。了解memcached的内部構造,就能知道如何使用memcached才能使Web應用的速度更上一層樓。歡迎繼續閱讀下一章。