Memcached缓存系统的介绍、安装以及应用方法详解
本文实例讲述了Memcached缓存系统的介绍、安装以及应用方法。分享给大家供大家参考,具体如下:
一.memcached是什么?
memcachedisahigh-performance,distributedmemoryobjectcachingsystem,genericinnature,butintendedforuseinspeedingupdynamicwebapplicationsbyalleviatingdatabaseload.
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@localhostsoftware]#tarzxvflibevent-1.4.11-stable.tar.gz [root@localhostlibevent-1.4.11-stable]#./configure–prefix=/usr [root@localhostlibevent-1.4.11-stable]#make [root@localhostlibevent-1.4.11-stable]#makeinstall
2.测试libevent是否安装成功
[root@localhostlibevent-1.4.11-stable]#ls-al/usr/lib|greplibevent lrwxrwxrwx1rootroot2207-1013:10libevent-1.1a.so.1->libevent-1.1a.so.1.0.2 -rwxr-xr-x1rootroot315962007-01-07libevent-1.1a.so.1.0.2 lrwxrwxrwx1rootroot2107-2103:33libevent-1.4.so.2->libevent-1.4.so.2.1.3 -rwxr-xr-x1rootroot30808807-2103:33libevent-1.4.so.2.1.3 -rw-r--r--1rootroot39447407-2103:33libevent.a lrwxrwxrwx1rootroot2607-2103:33libevent_core-1.4.so.2->libevent_core-1.4.so.2.1.3 -rwxr-xr-x1rootroot10949007-2103:33libevent_core-1.4.so.2.1.3 -rw-r--r--1rootroot14874207-2103:33libevent_core.a -rwxr-xr-x1rootroot86607-2103:33libevent_core.la lrwxrwxrwx1rootroot2607-2103:33libevent_core.so->libevent_core-1.4.so.2.1.3 lrwxrwxrwx1rootroot2707-2103:33libevent_extra-1.4.so.2->libevent_extra-1.4.so.2.1.3 -rwxr-xr-x1rootroot24687007-2103:33libevent_extra-1.4.so.2.1.3 -rw-r--r--1rootroot30737007-2103:33libevent_extra.a -rwxr-xr-x1rootroot87307-2103:33libevent_extra.la lrwxrwxrwx1rootroot2707-2103:33libevent_extra.so->libevent_extra-1.4.so.2.1.3 -rwxr-xr-x1rootroot83107-2103:33libevent.la lrwxrwxrwx1rootroot2107-2103:33libevent.so->libevent-1.4.so.2.1.3
安装OK。
3.安装memcached,同时需要安装中指定libevent的安装位置
[root@localhostsoftware]#tarzxvfmemcached-1.4.0.tar.gz [root@localhostmemcached-1.4.0]#./configure–with-libevent=/usr [root@localhostmemcached-1.4.0]#make [root@localhostmemcached-1.4.0]#makeintall
4.测试是否成功安装memcached
[root@localhostmemcached-1.4.0]#ls-al/usr/local/bin|grepmemcached -rwxr-xr-x1rootroot18822507-2103:35memcached
安装OK。
三.如何启动memcached服务:
只需要启动一个memcached监护进程,监护进程不需要配置文件,只要在命令行里面加三四个参数就可以了:
[root@localhostbin]#memcached-d-m100-uroot-l127.0.0.1-p11211-c256-P/tmp/memcached.pid
-d:(runasadaemon)选项是启动一个守护进程
-m:(maxmemorytouseforitemsinmegabytes(default:64MB))是分配给Memcache使用的内存数量,单位是MB,我这里是100MB,
-u:(assumeidentityof<username>(onlywhenrunasroot))是运行Memcache的用户,我这里是root,
-l:(interfacetolistenon)是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址127.0.0.1,
-p:是设置Memcache监听的端口,这里设置了11211,最好是1024以上的端口,
-c:选项是最大运行的并发连接数,默认是1024,这里设置了256,根据服务器的负载量来设定,
-P:(savePIDin<file>,onlyusedwith-doption)是设置保存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@localhostsoftware]#tarzxvfmemcache-2.2.5.tgz [root@localhostsoftware]#cdmemcache-2.2.5 [root@localhostmemcache-2.2.5]#/usr/bin/phpize [root@localhostmemcache-2.2.5]#./configure–enable-memcache–with-php-config=/usr/bin/php-config–with-zlib-dir [root@localhostmemcache-2.2.5]#make [root@localhostmemcache-2.2.5]#makeinstall
这步会有类似这样的提示:Installingsharedextensions:/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@localhostsrc]#tarzxvflibmemcached-0.32.tar.gz [root@localhostsrc]#cdlibmemcached-0.32 [root@localhostlibmemcached-0.32]#./configure--prefix=/usr [root@localhostlibmemcached-0.32]#make&&makeinstall
2.检查安装结果
[root@localhostsrc]#ls/usr/lib/libmemcache*//库文件 [root@localhostsrc]#ls/usr/include/libmemcached/*//头文件 [root@localhostsrc]#ls/usr/bin/mem*//命令行工具
六.应用:
1.启动memcache服务
[root@localhostbin]#memcached-d-m100-uroot-l127.0.0.1-p11211-c256-P/tmp/memcached.pid
2.重启Web服务器
[root@localhostbin]#servicehttpdrestart
3.创建demo测试程序
<?php //连接 $mem=newMemcache; $mem->connect("127.0.0.1",11211); echo'MemcacheVersionis:'.$mem->getVersion().'<br/>'; //保存数据 $mem->set('key1','Thisisfirstmemcachedemo',0,60); $val=$mem->get('key1'); echo"Getkey1value:".$val."<br/>" //关闭连接 $mem->close(); ?>
4.Memcached客户端与tokyotyrantDB操作访问
<?php $memcache=newmemcache(); $memcache->addServer('127.0.0.1:1978'); functionmicrotime_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> intmain(intargc,char*argv[]) { memcached_st*memc; memcached_returnrc; memcached_server_st*servers; charvalue[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,"Thisiscfirstvalue"); rc=memcached_set(memc,"key1",4,value,strlen(value), (time_t)180,(uint32_t)0); if(rc==MEMCACHED_SUCCESS){ printf("Savekey:key1data:/"%s/"success./n",value); } //获取数据 charreturn_key[MEMCACHED_MAX_KEY]; size_treturn_key_length; char*return_value; size_treturn_value_length; char*keys[]={"key1"}; size_tkey_length[]={4}; uint32_tflags; 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("Fetchkey:%sdata:%s/n",return_key,return_value); } //删除数据 rc=memcached_delete(memc,"key1",4,(time_t)0); if(rc==MEMCACHED_SUCCESS){ printf("DeleteKeykey1success./n"); } //释放内存 memcached_free(memc); return0; }
编译源代码:
[root@localhosthtml]#gcc-ocmemcmem.c-lmemcached [root@localhosthtml]#./cmem//执行 Savekey:key1data:"Thisiscfirstvalue"success. Fetchkey:key1data:Thisiscfirstvalue DeleteKeykey1success.
6.C/C++与Memcached分布式结合代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<libmemcached/memcached.h> intmain(intargc,char*argv[]) { memcached_st*memc; memcached_returnrc; memcached_server_st*servers; charvalue[8191]; //connectmultiserver 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); //Savemultidata size_ti; char*keys[]={"key1","key2","key3"}; size_tkey_length[]={4,4,4}; char*values[]={"Thisiscfirstvalue","Thisiscsecondvalue","Thisiscthirdvalue"}; size_tval_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("Savekey:%sdata:/"%s/"success./n",keys[i],values[i]); } } //Fetchmultidata charreturn_key[MEMCACHED_MAX_KEY]; size_treturn_key_length; char*return_value; size_treturn_value_length; uint32_tflags; 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("Fetchkey:%sdata:%s/n",return_key,return_value); } } //Deletemultidata 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%ssuccess/n",keys[i],values[i]); } } //free memcached_free(memc); return0; }
编译源代码:
[root@localhosthtml]#gcc-ocmultmemcmultmem.c-lmemcached [root@localhosthtml]#./cmultmem//执行 Savekey:key1data:"Thisiscfirstvalue"success. Savekey:key2data:"Thisiscsecondvalue"success. Savekey:key3data:"Thisiscthirdvalue"success. Fetchkey:key2data:Thisiscsecondvalue Fetchkey:key3data:Thisiscthirdvalue Fetchkey:key1data:Thisiscfirstvalue Deletekey1success Deletekey2success Deletekey3success
以上c/c++代码摘自:黑夜路人
7.查看Memcache进程
[root@localhosthtml]#psaux|grepmemcached root113820.00.7551241896?Ssl13:060:00memcached-d-m100-uroot-l127.0.0.1-p11211-c256-P/tmp/memcached.pid root113950.00.23912664pts/1R+13:080:00grepmemcached
8.结束Memcache进程
[root@localhosthtml]#kill`cat/tmp/memcached.pid`
希望本文所述对大家memcached缓存程序设计有所帮助。