一、Memcache介绍
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。
Memcache模块是一个高效的守护进程,提供用与内存缓存的过程式程序和面向对象的方便的接口,特别是对于设计动态Web程序时减少对数据库的访问。
二、Windows下memcache的安装
1.下载Memcache for win32
http://www.php100.com/html/download/tools/2010/0125/3857.html
2.下载php_memcache.dll(php 5.3.8 memcache 扩展dll)
http://hi.baidu.com/%E5%E2%E5%CB%C3%AB%C3%AB%B3%E6/blog/item/7612cf35a4425896a71e1267.html
(Note:注意你安装的PHP版本来下载相应的dll文件)
1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。
4.下载php_memcache.dll,请自己查找对应的php版本的文件(放在php/ext文件夹下)
5. 在php.ini 加入一行 ‘extension=php_memcache.dll’
6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!
三、如何监测memcache服务端的运行状况
•最新的memcache pecl中,新增了一个memcache.php,这个php文件可以用来方便的查看memcache的状况
•可以到这里下载源文件:http://livebookmark.net/memcachephp/memcachephp.zip
•配置详解
•1、设置用户名和密码
•define(‘ADMIN_USERNAME’,'memcache’); // Admin Username
define(‘ADMIN_PASSWORD’,'password’); // Admin Password
•2、配置服务器及其端口(支持检测多个主机的memcache)
•$MEMCACHE_SERVERS[] = ‘mymemcache-server1:11211′; // add more as an array
$MEMCACHE_SERVERS[] = ‘mymemcache-server2:11211′; // add more as an array
•更改为:$MEMCACHE_SERVERS[] = ‘127.0.0.1:11211′;
$MEMCACHE_SERVERS[] = ‘192.168.0.1:11211′;
四、写了一个和MySQL交互的小程序代码
<?php
header("Content-Type:text/html;charset=utf-8");
$db_user='root';
$db_passwd='';
$dsn="mysql:host=localhost;port=3306;dbname=test";
$memcachehost = '127.0.0.1'; //缓存服务器
$memcacheport = 11211; //缓存服务器端口
$memcachelife = 0; //缓存生命周期
$mem = new Memcache(); //实例化Memcache对象
$mem->connect($memcachehost, $memcacheport); //$mem->connect(缓存主机,缓存端口)
try
{ //异常捕捉
$pdo = new PDO($dsn, $db_user, $db_passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
unset($db_user);
unset($db_passwd); //释放变量,数据库安全策略
}
catch (PDOException $e)
{
echo $e->getMessage();
exit;
}
function query_memcache($sql){
global $mem,$memcachelife;
$key = md5($sql);
if(!($value = $mem->get($key))){ //Cache中没有,则从My SQL中查询
echo 11 . '<br />';
$microtime1 = microtime(); //设置从数据库取之前的时间
$query = query($sql);
while($item = mysql_fetch_array($query))
{
$result[] = $item;
}
$value = $result;
$microtime2 = microtime(); //设置从数据库取之后的时间
//将Key和Value写入MemCache
$mem->set($key,$result,0,$memcachelife);
$d_value = $microtime2 - $microtime1; //返回一个时间差
}
else
{
echo 22 . '<br />';
$microtime3 = microtime(); //设置从memcache中取之前的时间
$value = $mem->get($key);
$microtime4 = microtime(); //设置从memcache中取之后的时间
$d_value = $microtime4 - $microtime3; //返回一个时间差
}
echo $d_value;
return $value;
}
function query($sql)
{
if('' == $sql)
{
echo 'SQL语句错误:SQL语句为空';
}
$query = mysql_query($sql);
if(!$query)
{
echo '错误的SQL语句';
}
return $query;
}
foreach(query_memcache("select * from test.memcache where value = 'CS133604225199978'") as $row)
{
//echo $row[0].'-'.$row[1].'<br /><br />';
}
//$mem->flush(); //刷新缓存
五、利用时间差进行测试
2、从memcache内存中取出数据,在从内存中取数据之前设置一个时间戳,在取数据之后设置一个时间戳,两时间戳相减,返回一个时间差
在第一次运行程序时返得到的时间差是从数据库中取数据用的时间
以后再运行程序得到的时间差是从内存中去数据所用的时间
可以明显的看出来从数据库中取数据所用时间平均是从内存中取数据所用时间的 1000倍左右。
来源:oschina
链接:https://my.oschina.net/u/274778/blog/56316