memcached是什么?
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 為首開(kāi)發(fā)的一款軟件。現(xiàn)在已成為 mixi 、 hatena 、 Facebook 、 Vox 、LiveJournal等眾多服務(wù)中提高Web應(yīng)用擴(kuò)展性的重要因素。
許多Web應(yīng)用都將數(shù)據(jù)保存到RDBMS中,應(yīng)用服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示。但隨著數(shù)據(jù)量的增大、訪問(wèn)的集中,就會(huì)出現(xiàn)RDBMS的負(fù)擔(dān)加重、數(shù)據(jù)庫(kù)響應(yīng)惡化、網(wǎng)站顯示延遲等重大影響。
這時(shí)就該memcached大顯身手了。memcached是高性能的分布式內(nèi)存緩存服務(wù)器。一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。
圖1 一般情況下memcached的用途
memcached的特征
memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn)。
- 協(xié)議簡(jiǎn)單
- 基于libevent的事件處理
- 內(nèi)置內(nèi)存存儲(chǔ)方式
- memcached不互相通信的分布式
協(xié)議簡(jiǎn)單
memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式,而使用簡(jiǎn)單的基于文本行的協(xié)議。因此,通過(guò)telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)。下面是例子。
$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. set foo 0 0 3 (保存命令) bar (數(shù)據(jù)) STORED (結(jié)果) get foo (取得命令) VALUE foo 0 3 (數(shù)據(jù)) bar (數(shù)據(jù))
協(xié)議文檔位于memcached的源代碼內(nèi),也可以參考以下的URL。
基于libevent的事件處理
libevent是個(gè)程序庫(kù),它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對(duì)服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個(gè)libevent庫(kù),因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。關(guān)于事件處理這里就不再詳細(xì)介紹,可以參考Dan Kegel的The C10K Problem。
- libevent : http://www.monkey.org/~provos/libevent/
- The C10K Problem : http://www.kegel.com/c10k.html
內(nèi)置內(nèi)存存儲(chǔ)方式
為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,因此并沒(méi)有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題。關(guān)于內(nèi)存存儲(chǔ)的詳細(xì)信息,本連載的第二講以后前坂會(huì)進(jìn)行介紹,請(qǐng)屆時(shí)參考。
memcached不互相通信的分布式
memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒(méi)有分布式功能。各個(gè)memcached不會(huì)互相通信以共享信息。那么,怎樣進(jìn)行分布式呢?這完全取決于客戶端的實(shí)現(xiàn)。本連載也將介紹memcached的分布式。
圖2 memcached的分布式
接下來(lái)簡(jiǎn)單介紹一下memcached的使用方法。
安裝memcached
memcached的安裝比較簡(jiǎn)單,這里稍加說(shuō)明。
memcached支持許多平臺(tái)。
- Linux
- FreeBSD
- Solaris (memcached 1.2.5以上版本)
- Mac OS X
另外也能安裝在Windows上。這里使用Fedora Core 8進(jìn)行說(shuō)明。
memcached的安裝
運(yùn)行memcached需要本文開(kāi)頭介紹的libevent庫(kù)。Fedora 8中有現(xiàn)成的rpm包,通過(guò)yum命令安裝即可。
$ sudo yum install libevent libevent-devel
memcached的源代碼可以從memcached網(wǎng)站上下載。本文執(zhí)筆時(shí)的最新版本為1.2.5。Fedora 8雖然也包含了memcached的rpm,但版本比較老。因?yàn)樵创a安裝并不困難,這里就不使用rpm了。
- 下載memcached : http://www.danga.com/memcached/download.bml
memcached安裝與一般應(yīng)用程序相同,configure、make、make install就行了。
$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz $ tar zxf memcached-1.2.5.tar.gz $ cd memcached-1.2.5 $ ./configure $ make $ sudo make install
默認(rèn)情況下memcached安裝到/usr/local/bin下。
memcached的啟動(dòng)
從終端輸入以下命令,啟動(dòng)memcached。
$ /usr/local/bin/memcached -p 11211 -m 64m -vv slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 中間省略 slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp)
這里顯示了調(diào)試信息。這樣就在前臺(tái)啟動(dòng)了memcached,監(jiān)聽(tīng)TCP端口11211最大內(nèi)存使用量為64M。調(diào)試信息的內(nèi)容大部分是關(guān)于存儲(chǔ)的信息,下次連載時(shí)具體說(shuō)明。
作為daemon后臺(tái)啟動(dòng)時(shí),只需
$ /usr/local/bin/memcached -p 11211 -m 64m -d
這里使用的memcached啟動(dòng)選項(xiàng)的內(nèi)容如下。
選項(xiàng) | 說(shuō)明 |
-p | 使用的TCP端口。默認(rèn)為11211 |
-m | 最大內(nèi)存大小。默認(rèn)為64M |
-vv | 用very vrebose模式啟動(dòng),調(diào)試信息和錯(cuò)誤輸出到控制臺(tái) |
-d | 作為daemon在后臺(tái)啟動(dòng) |
上面四個(gè)是常用的啟動(dòng)選項(xiàng),其他還有很多,通過(guò)
$ /usr/local/bin/memcached -h
命令可以顯示。許多選項(xiàng)可以改變memcached的各種行為,推薦讀一讀。
用客戶端連接
許多語(yǔ)言都實(shí)現(xiàn)了連接memcached的客戶端,其中以Perl、PHP為主。僅僅memcached網(wǎng)站上列出的語(yǔ)言就有
- Perl
- PHP
- Python
- Ruby
- C#
- C/C++
- Lua
等等。
- memcached客戶端API : http://www.danga.com/memcached/apis.bml
這里介紹通過(guò)mixi正在使用的Perl庫(kù)鏈接memcached的方法。
使用Cache::Memcached
Perl的memcached客戶端有
- Cache::Memcached
- Cache::Memcached::Fast
- Cache::Memcached::libmemcached
等幾個(gè)CPAN模塊。這里介紹的Cache::Memcached是memcached的作者Brad Fitzpatric的作品,應(yīng)該算是memcached的客戶端中應(yīng)用最為廣泛的模塊了。
- Cache::Memcached - search.cpan.org : http://search.cpan.org/dist/Cache-Memcached/
使用Cache::Memcached連接memcached
下面的源代碼為通過(guò)Cache::Memcached連接剛才啟動(dòng)的memcached的例子。
#!/usr/bin/perl use strict; use warnings; use Cache::Memcached; my $key = "foo"; my $value = "bar"; my $expires = 3600; # 1 hour my $memcached = Cache::Memcached->new({ servers => ["127.0.0.1:11211"], compress_threshold => 10_000 }); $memcached->add($key, $value, $expires); my $ret = $memcached->get($key); print "$ret/n";
在這里,為Cache::Memcached指定了memcached服務(wù)器的IP地址和一個(gè)選項(xiàng),以生成實(shí)例。Cache::Memcached常用的選項(xiàng)如下所示。
選項(xiàng) | 說(shuō)明 |
servers | 用數(shù)組指定memcached服務(wù)器和端口 |
compress_threshold | 數(shù)據(jù)壓縮時(shí)使用的值 |
namespace | 指定添加到鍵的前綴 |
另外,Cache::Memcached通過(guò)Storable模塊可以將Perl的復(fù)雜數(shù)據(jù)序列化之后再保存,因此散列、數(shù)組、對(duì)象等都可以直接保存到memcached中。
保存數(shù)據(jù)
向memcached保存數(shù)據(jù)的方法有
- add
- replace
- set
它們的使用方法都相同:
my $add = $memcached->add( '鍵', '值', '期限' ); my $replace = $memcached->replace( '鍵', '值', '期限' ); my $set = $memcached->set( '鍵', '值', '期限' );
向memcached保存數(shù)據(jù)時(shí)可以指定期限(秒)。不指定期限時(shí),memcached按照LRU算法保存數(shù)據(jù)。這三個(gè)方法的區(qū)別如下:
選項(xiàng) | 說(shuō)明 |
add | 僅當(dāng)存儲(chǔ)空間中不存在鍵相同的數(shù)據(jù)時(shí)才保存 |
replace | 僅當(dāng)存儲(chǔ)空間中存在鍵相同的數(shù)據(jù)時(shí)才保存 |
set | 與add和replace不同,無(wú)論何時(shí)都保存 |
獲取數(shù)據(jù)
獲取數(shù)據(jù)可以使用get和get_multi方法。
my $val = $memcached->get('鍵'); my $val = $memcached->get_multi('鍵1', '鍵2', '鍵3', '鍵4', '鍵5');
一次取得多條數(shù)據(jù)時(shí)使用get_multi。get_multi可以非同步地同時(shí)取得多個(gè)鍵值,其速度要比循環(huán)調(diào)用get快數(shù)十倍。
刪除數(shù)據(jù)
刪除數(shù)據(jù)使用delete方法,不過(guò)它有個(gè)獨(dú)特的功能。
$memcached->delete('鍵', '阻塞時(shí)間(秒)');
刪除第一個(gè)參數(shù)指定的鍵的數(shù)據(jù)。第二個(gè)參數(shù)指定一個(gè)時(shí)間值,可以禁止使用同樣的鍵保存新數(shù)據(jù)。此功能可以用于防止緩存數(shù)據(jù)的不完整。但是要注意, set函數(shù)忽視該阻塞,照常保存數(shù)據(jù)
增一和減一操作
可以將memcached上特定的鍵值作為計(jì)數(shù)器使用。
my $ret = $memcached->incr('鍵'); $memcached->add('鍵', 0) unless defined $ret;
增一和減一是原子操作,但未設(shè)置初始值時(shí),不會(huì)自動(dòng)賦成0。因此,應(yīng)當(dāng)進(jìn)行錯(cuò)誤檢查,必要時(shí)加入初始化操作。而且,服務(wù)器端也不會(huì)對(duì)超過(guò)2<sup>32</sup>時(shí)的行為進(jìn)行檢查。
總結(jié)
這次簡(jiǎn)單介紹了memcached,以及它的安裝方法、Perl客戶端Cache::Memcached的用法。只要知道,memcached的使用方法十分簡(jiǎn)單就足夠了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
