Mamche
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 為首開發的一款軟體。現在已成為 mixi、Facebook、LiveJournal 等衆多服務中提高 Web 應用擴充性的重要因素。許多 Web 應用都将資料儲存到 RDBMS 中,應用伺服器從中讀取資料并在浏覽器中顯示。但随着資料量的增大、通路的集中,就會出現 RDBMS 的負擔加重、資料庫響應惡化、網站顯示延遲等重大影響。這時就該memcached 大顯身手了。memcached是高性能的分布式記憶體緩存伺服器。一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态 Web 應用的速度、提高可擴充性。
memcached 作為高速運作的分布式緩存伺服器,具有以下的特點。
協定簡單
基于 libevent 的事件處理
内置記憶體存儲方式
memcached 不互相通信的分布式
memcached 的伺服器用戶端通信并不使用複雜的 XML 等格式,而使用簡單的基于文本行的協定。是以,通過 telnet 也能在 memcached 上儲存資料、取得資料。
libevent 是個程式庫,它将 Linux 的 epoll、BSD 類作業系統的 kqueue 等事件處理功能封裝成統一的接口。即使對伺服器的連接配接數增加,也能發揮 O(1)的性能。memcached 使用這個 libevent 庫,是以能在 Linux、BSD、Solaris 等作業系統上發揮其高性能。
為了提高性能,memcached中儲存的資料都存儲在memcached 内置的記憶體存儲空間中。由于資料僅存在于記憶體中,是以重新開機 memcached、重新開機作業系統會導緻全部資料消失。另外,内容容量達到指定值之後,就基于 LRU(Least Recently Used)算法自動删除不使用的緩存。memcached 本身是為緩存而設計的伺服器,是以并沒有過多考慮資料的永久性問題。memcached 内部不會監視記錄是否過期,而是在 get 時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為 lazy(惰性)expiration。是以,memcached 不會在過期監視上耗費 CPU 時間。memcached 會優先使用已逾時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為 LeastRecently Used(LRU)機制來配置設定空間。顧名思義,這是删除“最近最少使用”的記錄的機制。是以,當 memcached 的記憶體空間不足時就從最近未被使用的記錄中搜尋,并将其空間配置設定給新的記錄。從緩存的實用角度來看,該模型十分理想。
memcached 盡管是“分布式”緩存伺服器,但伺服器端并沒有分布式功能。各個 memcached 不會互相通信以共享資訊。那麼,怎樣進行分布式呢?這完全取決于用戶端的實作。
部署 Memcached
============================================================
[root@localhost tmp]# tar xflibevent-2.0.15-stable.tar.gz
[root@localhost tmp]# cdlibevent-2.0.15-stable
[root@localhost libevent-2.0.15-stable]#./configure && make && make install
[root@localhost tmp]# tar xfmemcached-1.4.5.tar.gz
[root@localhost tmp]# cd memcached-1.4.5
[root@localhost memcached-1.4.5]#./configure && make && make install
[root@localhost memcached-1.4.5]#./memcached -h
開啟memcached監聽
[root@localhost memcached-1.4.5]#./memcached -p 11211 -l 192.168.122.10 -u root -m 64 -c 10 -vvv
建立一個視窗使用telnet 對 Memcached 發起連接配接
[root@node1 ~]# telnet 192.168.122.10 11211
Trying 192.168.122.10...
Connected to 192.168.122.10 (192.168.122.10).
Escape character is '^]'.
傳回開啟memcached 監聽的終端可看到連接配接提示
<27 server listening (udp)
<28 new auto-negotiating clientconnection
在telnet終端,連接配接測試,set 存資料,get 取資料
Connected to 192.168.122.10(192.168.122.10).
set nothing 0 180 10 ----- 0:辨別 180:過期時間 10:多少位元組
1234567890
STORED
get nothing
VALUE nothing 0 10
END
使用測試的 PHP 網頁,通過 PHP 連接配接 Memcached
=========================================================
[root@node1 ~]# yum install httpd php
[root@node1 ~]# rpm -ivhphp-pecl-memcache-2.1.2-1.el5.rf.i386.rpm
[root@node1 ~]# cp memcached.php/var/www/html/
[root@node1 ~]# vim/var/www/html/memcached.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.122.10',11211) or die ("Could notconnect");
$version = $memcache->getVersion();
echo "Server's version:".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object,false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (datawill expire in 10 seconds)<br/>\n";
$get_result = $memcache->get('key');
echo "Data from thecache:<br/>\n";
var_dump($get_result);
?>
[root@node1 ~]# service httpd start
測試:
[root@localhost ~]# elinks --dumphttp://192.168.122.10/test.php
Server's version: 1.4.5
Store data in the cache (data will expirein 10 seconds)
Data from the cache:
object(stdClass)#3 (2) {["str_attr"]=> string(4) "test"["int_attr"]=> int(123) }
本文轉自潘闊 51CTO部落格,原文連結:http://blog.51cto.com/pankuo/1392491,如需轉載請自行聯系原作者