Memcached的介绍、安装和使用

jopen 11年前

一、Memcached介绍

1、什么是Memcached?

Memcached是国外社区网站LiveJournal的开发团队开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

官方网站:http://memcached.org/

2、Memcached的运行图

Memcached的介绍、安装和使用


二、Memcached安装和使用

1、Memcached安装

安装步骤:先安装libevent,再安装Memcached主程序

安装libevent:


yum –y install libevent*


再安装Memcached:


tar -xzf memcached-1.4.10.tar.gz    cd memcached-1.4.10    ./configure --prefix=/usr/local/memcache    make && make install    useradd memcache    passwd memcache


2、 Memcached运行

启动Memcached


/usr/local/memcache/bin/memcached -p 11211 -u memcache &


关闭服务:


kill %1   #1表示为后台服务的数字标识


查看Memcached帮助信息:


/usr/local/memcache/bin/memcached –h


检查是否正常启动:


ps –aux | grep memcached    或    netstat –tunpl | grep :11211    或    telnet 192.168.10.1 11211   #测试连接状态    stats   #统计Memcached的各种信息


3、Memcached和PHP结合使用

1)、需要安装PHP Memcache扩展

编译安装memcache


tar zxvf memcache-2.2.5.tgz    cd memcache-2.2.5    /usr/local/php/bin/phpize    ./configure --with-php-config=/usr/local/php/bin/php-config    make && make install


配置:


ls -l /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.so    vi /usr/local/php/etc/php.ini


新增以下配置内容:


extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"    extension="memcache.so"


检查安装结果:


/usr/local/php/bin/php –m    /usr/local/apache2/bin/apachectl restart


2)、PHPMemcache结合的测试代码


<?php          //连接memcache            $mem = new Memcache;            $mem->connect('localhost',11211);              //保存数据            $mem->set('key1','this is first value',0,60);            $val = $mem->get('key1');            echo "Get key1 value:".$val."<br/>";              //替换数据            $mem->replace('key1','this is replace value',0,60);            $val = $mem->get('key1');            echo "Get key1 value:".$val."<br/>";              //保存数组数据            $arr = array('aa','bb','cc');            $mem->set('key2',$arr,0,60);            $val2 = $mem->get('key2');            echo "Get key2 value:";            echo "<pre>";            print_r($val2);                 //关闭连接            $mem->close();    ?>


3)、PHPMemcache分布式:在一台或者多台机器启用一个或者多个进程,这里是在一台机器启用两个进程,使用两个接口:


/usr/local/memcache/bin/memcached –u memcache –p 11211 &    /usr/local/memcache/bin/memcached –u memcache –p 11212 &    /usr/local/memcache/bin/memcached –u memcache –p 11213&


示例代码:


<?php            //连接memcache            $mem = new Memcache;            $mem->addServer('localhost',11211);            $mem->addServer('localhost',11212);            $mem->addServer('localhost',11213);              //保存数据            $mem->set('key1','this is first value',0,60);            $val = $mem->get('key1');            echo "Get key1 value:".$val."<br/>";              //替换数据            $mem->replace('key1','this is replace value',0,60);            $val = $mem->get('key1');            echo "Get key1 value:".$val."<br/>";              //保存数组数据            $arr = array('aa','bb','cc');            $mem->set('key2',$arr,0,60);            $val2 = $mem->get('key2');            echo "Get key2 value:";            echo "<pre>";            print_r($val2);            echo "</pre>";              //关闭连接            $mem->close();    ?>


另外,PHP作为memcached客户端实现起来很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。

下边是一个利用 memcached 来缓存数据库查询结果集的示例:

<?php   $mc = new memcached();  $sql = 'SELECT * FROM users';    $key = md5($sql);   //memcached 对象标识符    if ( !($datas = $mc->get($key)) ) {          // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。           echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";           $conn = mysql_connect('localhost', 'test', 'test');           mysql_select_db('test');           $result = mysql_query($sql);           while ($row = mysql_fetch_object($result))               $datas[] = $row;                // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。               $mc->add($key, $datas);    } else {                echo "n".str_pad('Read datas from memcached.', 60, '_')."n";    }    var_dump($datas);    ?>