Memcached 緩衝系統的-介紹、安裝以及應用

來源:互聯網
上載者:User

 

一. 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 libevent
lrwxrwxrwx   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.2
lrwxrwxrwx   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.a
lrwxrwxrwx   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.la
lrwxrwxrwx   1 root root       26 07-21 03:33 libevent_core.so -> libevent_core-1.4.so.2.1.3
lrwxrwxrwx   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.la
lrwxrwxrwx   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.la
lrwxrwxrwx   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 監護進程,監護進程不需要設定檔,只要在命令列裡面加三四個參數就可以了:
[root@localhost bin]# memcached -d -m 100 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid
-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檔案的修改:
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"/nextension = "memcache.so"/n#' /usr/local/webserver/php/etc/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 服務
[root@localhost bin]# memcached -d -m 100 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid
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 value
Delete 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 value
Fetch key:key3 data:This is c third value
Fetch key:key1 data:This is c first value
Delete key1 success
Delete key2 success
Delete key3 success
以上c/c++代碼摘自:黑夜路人

7. 查看Memcache進程
[root@localhost html]# ps aux | grep memcached
root     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.pid
root     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`


For more:http://cn.php.net/memcache

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.