本文實例講述了Memcached緩存系統的介紹、安裝以及應用方法。分享給大家供大家參考,具體如下:
一. memcached 是什么?
memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
memcached是一個高性能的、分布式內存對象緩存系統,應用廣泛。 通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、 提高可擴展性。
它可以應對任意多個連接,使用非阻塞的網絡IO。由于它的工作機制是在內存中開辟一塊空間,然后建立一個HashTable,Memcached自管理這些HashTable。還使用內置的內存塊分配和哈希表算法,確保虛擬內存不會過來搗亂。
Memcached 官方網站:http://www.danga.com/memcached
二. memcached 的安裝:
注:memcached 用到了libevent這個庫用于Socket的處理,所以還需要安裝libevent.官網:http://www.monkey.org/~provos/libevent/
1. 先安裝libevent:
[root@localhost software]# tar zxvf libevent-1.4.11-stable.tar.gz[root@localhost libevent-1.4.11-stable]# ./configure –prefix=/usr[root@localhost libevent-1.4.11-stable]# make[root@localhost libevent-1.4.11-stable]# make install
2. 測試libevent是否安裝成功
[root@localhost libevent-1.4.11-stable]# ls -al /usr/lib | grep libeventlrwxrwxrwx 1 root root 22 07-10 13:10 libevent-1.1a.so.1 -> libevent-1.1a.so.1.0.2-rwxr-xr-x 1 root root 31596 2007-01-07 libevent-1.1a.so.1.0.2lrwxrwxrwx 1 root root 21 07-21 03:33 libevent-1.4.so.2 -> libevent-1.4.so.2.1.3-rwxr-xr-x 1 root root 308088 07-21 03:33 libevent-1.4.so.2.1.3-rw-r--r-- 1 root root 394474 07-21 03:33 libevent.alrwxrwxrwx 1 root root 26 07-21 03:33 libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.1.3-rwxr-xr-x 1 root root 109490 07-21 03:33 libevent_core-1.4.so.2.1.3-rw-r--r-- 1 root root 148742 07-21 03:33 libevent_core.a-rwxr-xr-x 1 root root 866 07-21 03:33 libevent_core.lalrwxrwxrwx 1 root root 26 07-21 03:33 libevent_core.so -> libevent_core-1.4.so.2.1.3lrwxrwxrwx 1 root root 27 07-21 03:33 libevent_extra-1.4.so.2 -> libevent_extra-1.4.so.2.1.3-rwxr-xr-x 1 root root 246870 07-21 03:33 libevent_extra-1.4.so.2.1.3-rw-r--r-- 1 root root 307370 07-21 03:33 libevent_extra.a-rwxr-xr-x 1 root root 873 07-21 03:33 libevent_extra.lalrwxrwxrwx 1 root root 27 07-21 03:33 libevent_extra.so -> libevent_extra-1.4.so.2.1.3-rwxr-xr-x 1 root root 831 07-21 03:33 libevent.lalrwxrwxrwx 1 root root 21 07-21 03:33 libevent.so -> libevent-1.4.so.2.1.3
安裝OK。
3. 安裝memcached,同時需要安裝中指定libevent的安裝位置
[root@localhost software]# tar zxvf memcached-1.4.0.tar.gz[root@localhost memcached-1.4.0]# ./configure –with-libevent=/usr[root@localhost memcached-1.4.0]# make[root@localhost memcached-1.4.0]# make intall
4. 測試是否成功安裝memcached
[root@localhost memcached-1.4.0]# ls -al /usr/local/bin | grep memcached-rwxr-xr-x 1 root root 188225 07-21 03:35 memcached
安裝OK。
三. 如何啟動 memcached 服務:
只需要啟動一個 memcached 監護進程,監護進程不需要配置文件,只要在命令行里面加三四個參數就可以了:
-d: (run as a daemon) 選項是啟動一個守護進程
-m:(max memory to use for items in megabytes (default: 64 MB))是分配給Memcache使用的內存數量,單位是MB,我這里是100MB,
-u:(assume identity of <username> (only when run as root))是運行Memcache的用戶,我這里是root,
-l:(interface to listen on)是監聽的服務器IP地址,如果有多個地址的話,這里指定了服務器的IP地址127.0.0.1,
-p:是設置Memcache監聽的端口,這里設置了11211,最好是1024以上的端口,
-c:選項是最大運行的并發連接數,默認是1024,這里設置了256,根據服務器的負載量來設定,
-P:(save PID in <file>, only used with -d option)是設置保存Memcache的pid文件,這里是保存在 /tmp/memcached.pid
注:也可以啟動多個守護進程,不過端口不能重復。
四. 安裝 Memcached 的PHP擴展:
在PHP中使用Memcached,有兩種方式:
一種是安裝PHP的memcached擴展。該擴展是用c寫的,效率較高,需要在服務器上安裝。
另外一種則是直接使用客戶端的php-memcached-client類庫。
下面是使用PECL中Memcache的專用擴展,因為畢竟是用C寫的,效率高,而且安裝部署起來也比較方便。
1. 在 http://pecl.php.net/package/memcache 選擇相應想要下載的memcache版本。我下載的是:memcache-2.2.5.tgz 版本。
2. 安裝 memcache
[root@localhost software]# tar zxvf memcache-2.2.5.tgz[root@localhost software]# cd memcache-2.2.5[root@localhost memcache-2.2.5]# /usr/bin/phpize[root@localhost memcache-2.2.5]# ./configure –enable-memcache –with-php-config=/usr/bin/php-config –with-zlib-dir[root@localhost memcache-2.2.5]# make[root@localhost memcache-2.2.5]# make install
這步會有類似這樣的提示:Installing shared extensions: /usr/local/php/modules
3. 把/etc/php.ini中的
extension_dir = "./"
修改為:
extension_dir = "/usr/lib/php/modules"
4. 并添加: extension=memcache.so
也可執行以下shell命令,對php.ini文件的修改:
五. 安裝C/C++ Memcached客戶端庫:libmemcached
下載:http://download.tangent.org/libmemcached-0.32.tar.gz
1. 安裝 libmemcached
[root@localhost src]# tar zxvf libmemcached-0.32.tar.gz[root@localhost src]# cd libmemcached-0.32[root@localhost libmemcached-0.32]# ./configure --prefix=/usr[root@localhost libmemcached-0.32]# make && make install
2. 檢查安裝結果
[root@localhost src]# ls /usr/lib/libmemcache* //庫文件[root@localhost src]# ls /usr/include/libmemcached/* //頭文件[root@localhost src]# ls /usr/bin/mem* //命令行工具
六. 應用:
1. 啟動 memcache 服務
2. 重啟 Web 服務器
[root@localhost bin]# service httpd restart
3. 創建 demo 測試程序
<?php//連接$mem = new Memcache;$mem->connect("127.0.0.1", 11211);echo 'Memcache Version is:'.$mem->getVersion().'<br/>';//保存數據$mem->set('key1', 'This is first memcache demo', 0, 60);$val = $mem->get('key1');echo "Get key1 value: ".$val."<br/>"//關閉連接$mem->close();?>
4. Memcached客戶端與tokyotyrant DB操作訪問
<?php$memcache = new memcache();$memcache->addServer('127.0.0.1:1978');function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}$time_start = microtime_float();$data = 'abc123';for($i = 0;$i <= 20000 ;$i++){ $key = (string) rand(1,100); $memcache->set($key, $data);}for($i = 0;$i <= 20000 ;$i++){ $key = (string) rand(1,100); echo $data = $memcache->get($key).'-'.$i.'<br/>';}$time_end = microtime_float();$time = $time_end - $time_start;echo $time;$memcache->close();?>
5. C/C++ 與 Memcached 結合代碼
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <libmemcached/memcached.h>int main(int argc, char *argv[]){ memcached_st *memc; memcached_return rc; memcached_server_st *servers; char value[8191]; //連接服務器 memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, "127.0.0.1",11211, &rc); rc = memcached_server_push(memc, servers); memcached_server_free(servers); //存儲數據 strcpy(value, "This is c first value"); rc = memcached_set(memc, "key1", 4, value, strlen(value), (time_t)180, (uint32_t)0); if (rc == MEMCACHED_SUCCESS) { printf("Save key:key1 data:/"%s/" success./n", value); } //獲取數據 char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; char *return_value; size_t return_value_length; char *keys[]= {"key1"}; size_t key_length[]= {4}; uint32_t flags; rc = memcached_mget(memc, keys, key_length, 1); return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { printf("Fetch key:%s data:%s/n", return_key, return_value); } //刪除數據 rc = memcached_delete(memc, "key1", 4, (time_t)0); if (rc == MEMCACHED_SUCCESS) { printf("Delete Key key1 success./n"); } //釋放內存 memcached_free(memc); return 0;}
編譯源代碼:
[root@localhost html]# gcc -o cmem cmem.c -lmemcached[root@localhost html]# ./cmem //執行Save key:key1 data:"This is c first value" success.Fetch key:key1 data:This is c first valueDelete Key key1 success.
6. C/C++ 與 Memcached 分布式結合代碼
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <libmemcached/memcached.h>int main(int argc, char *argv[]){ memcached_st *memc; memcached_return rc; memcached_server_st *servers; char value[8191]; //connect multi server memc = memcached_create(NULL); servers = memcached_server_list_append(NULL, "localhost", 11211, &rc); servers = memcached_server_list_append(servers, "localhost", 11212, &rc); rc = memcached_server_push(memc, servers); memcached_server_free(servers); //Save multi data size_t i; char *keys[]= {"key1", "key2", "key3"}; size_t key_length[]= {4, 4, 4}; char *values[] = {"This is c first value", "This is c second value", "This is c third value"}; size_t val_length[]= {21, 22, 21}; for (i=0; i <3; i++) { rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180,(uint32_t)0); if (rc == MEMCACHED_SUCCESS) { printf("Save key:%s data:/"%s/" success./n", keys[i], values[i]); } } //Fetch multi data char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; char *return_value; size_t return_value_length; uint32_t flags; rc = memcached_mget(memc, keys, key_length, 3); while ((return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc))) { if (rc == MEMCACHED_SUCCESS) { printf("Fetch key:%s data:%s/n", return_key, return_value); } } //Delete multi data for (i=0; i <3; i++) { rc = memcached_set(memc, keys[i], key_length[i], values[i], val_length[i], (time_t)180, (uint32_t)0); rc = memcached_delete(memc, keys[i], key_length[i], (time_t)0); if (rc == MEMCACHED_SUCCESS) { printf("Delete %s success/n", keys[i], values[i]); } } //free memcached_free(memc); return 0;}
編譯源代碼:
[root@localhost html]# gcc -o cmultmem cmultmem.c -lmemcached[root@localhost html]# ./cmultmem //執行Save key:key1 data:"This is c first value" success.Save key:key2 data:"This is c second value" success.Save key:key3 data:"This is c third value" success.Fetch key:key2 data:This is c second valueFetch key:key3 data:This is c third valueFetch key:key1 data:This is c first valueDelete key1 successDelete key2 successDelete key3 success
以上c/c++代碼摘自:黑夜路人
7. 查看Memcache進程
[root@localhost html]# ps aux | grep memcachedroot 11382 0.0 0.7 55124 1896 ? Ssl 13:06 0:00 memcached -d -m 100 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pidroot 11395 0.0 0.2 3912 664 pts/1 R+ 13:08 0:00 grep memcached
8. 結束Memcache進程
[root@localhost html]# kill `cat /tmp/memcached.pid`
希望本文所述對大家memcached緩存程序設計有所幫助。
新聞熱點
疑難解答
圖片精選