如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作;作为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();
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