Memcahced开源分布式内存对象缓存系统通过减少数据库的负担,从而能够加速你的web应用。在本文中我将解释怎样实现一个基于Memcahced的缓存系统。
数据库
实例中使用的数据库表包含一个自增的id,一个标题和一个链接字段:
1 2 3 4 5 6 | CREATE TABLE demos ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(300), link VARCHAR(300), ); |
第一次用户请求到达
第一次用户发送请求,PHP程序会在访问db数据库的同时,将访问的数据写入Memcached系统。
如图所示,user发送了req请求,application发送数据请求到database,database在将数据返回给application的同时,将数据缓存到了Memcached服务器。
第二次用户请求到达了
第二次用户请求到达,会直接读取Memcached服务器的缓存,而不是数据库中的内容,从而减轻了服务器的负担。
本图显示,第二次的请求,application直接从Memcached(简称Mc)读取数据。
Memcached的安装方法
网络上有大量关于Memcached安装的方法,其实它就是一个缓存服务器应用程序,意思就像是你装了个Mysql一样,装好了用账号密码IP地址连一下就能使用。
以下是一些很好的资源:
php_memcache.dll
index.php用PHP操作Memcached的演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php include('db.php'); $memcache = new Memcache; $memcache->connect('localhost', 11211) or die ("Could not connect"); //缓存服务器中,都是键值对,这里我们设定唯一的键 $key = md5('www.crazyant.net'); $cache_result = array(); //根据键,从缓存服务器中获取它的值 $cache_result = $memcache->get($key); //如果存在该键对应的值,说明缓存中存在该内容 if($cache_result){ //那我们直接取出缓存的内容就可以了 $demos_result=$cache_result; } else { //如果缓存中没有该键对应的值数据,说明请求是第一次到达 //首先,我们需要从数据库中取出该值 $v=mysql_query("select * from demos order by id desc"); while($row=mysql_fetch_array($v)){ //取出的内容就是我们需要的 $demos_result[]=$row; } //最后,将这次从数据库取出的内容,放到Memcached缓存服务器,这里就是缓存的精髓 $memcache->set($key, $demos_result, MEMCACHE_COMPRESSED, 1200); } //前面的所有操作,最终返回了我们需要的数据 // foreach($demos_result as $row){ echo '<a href='.$row['link'].'>'.$row['title'].'</a>'; } ?> |
db.php用于连接数据库的代码
你需要改变代码中的IP地址、用户名、密码、数据库名字。
1 2 3 4 5 6 7 8 9 | <?php $mysql_hostname = "localhost"; $mysql_user = "username"; $mysql_password = "password"; $mysql_database = "database"; $bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Opps some thing went wrong"); mysql_select_db($mysql_database, $bd) or die("Opps some thing went wrong"); ?> |
注:本文参考
关于Windows7 下面安装memcached和php的memcache扩展
http://blog.sina.com.cn/s/blog_61d0b6cd0100w9qq.html
Php代码与memcached的交互和与mysql的交互原理是一样的,需要安装一个服务器端的memcached ,现有的交互处理过程已经封装成了一个php的扩展了;需要在php.ini中,将这个扩展加进去。
Php memcached官方手册地址:http://cn2.php.net/manual/en/memcached.get.php
说说我的安装过程:
1.我的环境:php-5.2.6. memcached-win32-1.2.6.
2. 根据下面的步骤安装完以后,可以去控制面板看看memcached服务是否启动起来。如果没有此服务需要重新安装,如果有了,不能启动,可以看一下是不是路径错误了。【我的就是路径错误,启动不起来。找不到指定文件。】
3.php5.2.6自带memcache.dll文件,可以打开phpinfo()看看有没有memcache的扩展。如果没有,可以去pecl地址下载对应版本的memcache替换掉原来的。
一:下载地址:
php扩展库pecl下载地址:
二:安装与配置:
安装方法一:下载以后,解压,然后放到C盘根目录下。双击memcached.exe就可以启动memcached服务了,这时,你可以打开任务管理器,如果在进程里出现memcached.exe就说明memcached服务已经启动了,还要让cmd窗口开着,这样才是启动了memcached服务。
安装方法二:
1.下载Windows版的memache的压缩包
2.解压到合适的位置如:D:memached目录下面。
3.进入命令行切换到该目录下面,可以用dir看一下目录下面的文件信息。
4. 输入:memached.exe -d install 安装服务器。
5. 输入:memached.exe -d start启动服务器,等到下次启动系统的时候,此服务会自动启动。默认的端口号为11211.
配置:
1. 下载pecl模块包(地址如上),解压后将php_memache.dll放到php目录的ext子目录下,为了使得能正常使用,最好下载和php版本一致的模块包。
2. 在php.ini文件中导入'extension=php_memcache.dll'
然后重启apache,估计就可以了(可以在phpinfo.php 中,看看是否有memcached模块),当然了,我们可以写一个实验一下
$memcache_obj = new Memcache;
$memcache_obj->connect('localhost', 11211);
$memcache_obj->set('var_key', 'This is a memcached test!',MEMCACHE_COMPRESSED, 50);
echo $memcache_obj->get('var_key');
备注:
1)memcached 的几个指令:
-p监听的端口
-l连接的IP地址, 默认是本机-d start启动memcached服务-d restart重起memcached服务-d stop|shutdown关闭正在运行的memcached服务-d install安装memcached服务-d uninstall卸载memcached服务-u以的身份运行(仅在以root运行的时候有效)-m 最大内存使用,单位MB。默认64MB-M 内存耗尽时返回错误,而不是删除项-c最大同时连接数,默认是1024-f 块大小增长因子,默认是1.25-n 最小分配空间,key+value+flags默认是48-h 显示帮助2)memcached相关的函数:
01.Memcache::add —添加一个值,如果已经存在,则返回false
02.Memcache::addServer — 添加一个可供使用的服务器地址03.Memcache::close —关闭一个Memcache对象04.Memcache::connect —创建一个Memcache对象05.memcache_debug —控制调试功能06.Memcache::decrement —对保存的某个key中的值进行减法操作07.Memcache::delete —删除一个key值
08.Memcache::flush —清除所有缓存的数据09.Memcache::get —获取一个key值10.Memcache::getExtendedStats —获取进程池中所有进程的运行系统统计11.Memcache::getServerStatus —获取运行服务器的参数12.Memcache::getStats —返回服务器的一些运行统计信息13.Memcache::getVersion —返回运行的Memcache的版本信息14.Memcache::increment —对保存的某个key中的值进行加法操作15.Memcache::pconnect —创建一个Memcache的持久连接对象16.Memcache::replace — R对一个已有的key进行覆写操作17.Memcache::set —添加一个值,如果已经存在,则覆写18.Memcache::setCompressThreshold —对大于某一大小的数据进行压缩19.Memcache::setServerParams —在运行时修改服务器的参数3)zend framework的cache后端支持memcached,我们也可以来试试看
$front = array('lifeTime' =>100,'automatic_serialization' =>true);
$back = array('server' =>array(array('host' =>'127.0.0.1','port' =>11211,'persistent' =>true)),compression =>true); //后端server是个二维数组,每一维代表一个连接。 $cache = Zend_Cache::factory("Core","Memcached",$front,$back); $cache->save('This is zend memcached','zend'); echo $cache->load('zend')."<br />";