PHP使用Memcache详解

如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作;作为PHP开发人员,我们一般能想到的方法有页面静态化处理、防盗链、CDN内容分发加速访问、mysql数据库优化建立索引、架设apache服务器集群()、还有就是现在流行的各种分布式缓存技术:如memcached/redis;

一、Memcache简介 
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached管理这些HashTable,所以速度非常快。 

memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于memcached的分布式,则是完全由客户端程序库实现的。这种分布式是memcached的最大特点。


二、Memcache和memcached的区别 

为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

二、memcached使用详细介绍

 

1.什么是Memcached?

a.Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

b.Memcached的键key一般是字符串,该值不能重复;value可以放入字符串、数组、数值、对象、布尔,二进制数据和图片视频

c.Memcached默认服务端口是11211

2.PHP使用Memcached步骤

<1>准备:下载Memcached服务安装包:memcached-1.2.6-win32-bin.7z和访问Memcached服务的dll库:php_memcache.dll

www.memcached.org(官网进不去好像,可以从其他地方下载)

<2>解压包memcached-1.2.6-win32-bin.7z(可以解压完复制放到web服务器同级目录),然后操作cmd,进入到刚才解压的目录用命令安装:memcached.exe -d install

<3>安装完(判断是否安装完毕可以到服务列表里面查看是否有memcached服务),然后cmd用命令启动:memcached.exe -d start

<4>启动完memcached服务后,再把下载的php_memcache.dll放到web服务器php5目录下的ext目录下

<5>在php.ini里面修改,加载扩展库php_memcache.dll,然后重启apache服务器

<6>开始实践,memcached主要有crud操作(即创建、读取、更新、删除值操作,具体可以查阅手册),下面弄个简单的设置值,然后读取值的操作

a.设置值页面

connect( "127.0.0.1" )) {
     echo "连接Memcache服务器失败!" ;
}
 
//设置,'myword'参数代表键key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表压缩内容,50代表存放时间,单位秒
if ($mem->set( 'myword' , 'hello world' ,MEMCACHE_COMPRESSED, 50 ))
{
     echo "设置值成功!" ;
}
 
?>

注:如果值在内存存放的时间要超过30天,要用时间戳来设置100天:如time()+3600*24*100;设置0则表示永不过期


b.读取值页面

connect( "127.0.0.1" )) {
     echo "连接Memcache服务器失败!" ;
}
 
//读取键myword值
$value = $mem->get( 'myword' );
if (!$value)
{
     echo "读取失败!" ;
}
else
{
     echo "读取的值=" .$value;

}


c.删除、更新例子:


connect( "127.0.0.1" )) {
     echo "连接Memcache服务器失败!" ;
}
 
//设置,'myword'参数代表键key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表压缩内容,50代表存放时间,单位秒
if ($mem->set( 'myword' , 'hello world' ,MEMCACHE_COMPRESSED, 50 ))
{
     echo "设置值成功!" ;
}
 
//读取键myword值
$value = $mem->get( 'myword' );
if (!$value)
{
     echo "读取失败!" ;
}
else
{
     echo "读取的值=" .$value;
}
 
//更新键值
$mem->replace( 'myword' , 'hello everybody!' );
 
$value = $mem->get( 'myword' );
if (!$value)
{
     echo "读取失败!" ;
}
else
{
     echo "读取的值=" .$value;
}
 
//删除键myword值
$mem->delete( 'myword' );
 
$value = $mem->get( 'myword' );
if (!$value)
{
     echo "读取失败!" ;
}
else
{
     echo "读取的值=" .$value;
}
 
//关闭
$mem->close(); 
 
 
  <7>多个memcached服务器设置,其实就比一个memcached服务器改变一点点,就是把多个memcached的服务器通过方法addserver添加到连接池中,这样设置完后,crud操作时,内部就会通过相应算法均衡连接相应服务器并执行相应操作中。


addserver( '192.168.0.1' , 11211 );
$mem->addserver( '192.168.0.2' , 11211 );
$mem->addserver( '192.168.0.3' , 11211 );
$mem->addserver( '192.168.0.4' , 11211 );
 
 
//设置,'myword'参数代表键key,'hello world'代表存放的值,MEMCACHE_COMPRESSED代表压缩内容,50代表存放时间,单位秒
if ($mem->set( 'myword' , 'hello world' ,MEMCACHE_COMPRESSED, 50 ))
{
     echo "设置值成功!" ;
}
 
//读取键myword值
$value = $mem->get( 'myword' );
if (!$value)
{
     echo "读取失败!" ;
}
else
{
     echo "读取的值=" .$value;
}
 

?>


注:

memcached作者提醒开发人员不要用memcached存储session. 如果用memcached存储session,那么当memcached集群发生故障(比如内存溢出) 或者维护(比如升级/增加或减少服务器)时,用户会无法登录,或者被踢掉线. memcached使用LRU算法的回收机制可能会导致用户无缘无故地掉线. 而最糟糕的是,你很可能甚至都不会注意到它,直至用户开始抱怨.

Memcached主要用来做数据库读操作的缓存.比如程序先从Memcached中读数据,不存在时才去读MySQL.比如你有一条SQL语句,你可以把这条SQL语句MD5后作为Memcached的key,这条SQL语句的查询结果作为Memcached的value.

http://php.net/manual/zh/memcached.set.php
get($key)) ) {
	$value = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
	$expire = time() + 3600; //过期时间1小时
	$mc->set($key, $value, $expire);
	return $value;
}
return $value;


转载:http://mp.weixin.qq.com/s/oax3D4pW9-r3n16YLA2FQw

你可能感兴趣的:(PHP,缓存)