Memcache:缓存
缓存分类(存储位置)
1.文件缓存
2.内存缓存
3.数据库缓存(实际开发很少用)
缓存分类(存储数据的不同)
1.页面缓存
2.局部缓存
3.变量缓存(数据缓存)
memcache缓存方式
1.内存缓存
2.变量缓存(数据缓存)
memcache特点
1.数据驻留在内存中
2.速度快
3.存储数据量小
4.计算机断电后,数据全部丢失
memcache支持网络
1.服务
2.端口号
memcache资源包
memcached-1.2.6-win32-bin.zip(32位)
memcache-1.2.6-win64-bin.zip(64位)
memcache服务相关操作
1.安装服务
1)打开命令提示符窗口(以管理员方式打开)
以管理员身份运行的方法是在C:/windows/system32/下找到cmd之后右键“以管理员身份运行”就好了。
BCDEdit /SET "{bootmgr}" displaybootmenu yes
2)输入如下命令,进行安装
切换到e盘(memcached所在的目录)
e:memcached\memcached.exe -d install
2.卸载服务
1)打开命令提示符窗口(以管理员方式打开)
2)输入如下命令,进行安装
切换到e盘(memcache所在的目录)
memcached\memcached.exe -d uninstall
3.启动或停止服务
1)打开命令提示符窗口(以管理员方式打开)
2)输入如下命令,进行安装
切换到f盘(memcache所在的目录)
e:回车
memcached\memcached.exe -d start
memcached\memcached.exe -d stop
php操作memcache
修改php.ini配置文件,添加memcache扩展
将php_memcache.dll复制到php安装目录中的ext目录
在php.ini添加如下代码
extension=php_memcache.dll
重启apache服务
memcache缓存数据的方法
$mem=new memcache();
$mem->connect("主机地址",11211);
$变量=$mem->get(“名”);
if($变量==NULL){
$mem->set(名,值,标识,缓存时间);
}
$mem->close();
memcache方法
1.链接memcache服务
$mem->connect();
2.存储数据
$mem->set(名,值,标识,缓存时间);
3.取数据
$变量=$mem->get(名);
4.替换缓存中的数据
$mem->replace(名,值,标识,缓存时间);
5.删除指定的缓存数据
$mem->delete(名)
6.清空缓存
$mem->flush()
7.关闭连接
$mem->colse()
<?php
header
(
"content-type:text/html;charset=utf-8"
);
//Memcache实现内存缓存
$mem
= new
Memcache
();
//实例化
$mem
->
connect(
"localhost"
,
11211
);
//连接服务
//从缓存中取数据
$t
=
$mem
->
get(
"t"
);
if
($t
==
NULL
)
//缓存中没有t这个数据
{
$t
=
time
();
//向缓存中添加数据
$mem
->
set(
"t"
,$t,
MEMCACHE_COMPRESSED
,
3
);
//名,值,标识,时间
/**
* 第三个参数:标识
* MEMCACHE_COMPRESSED:启动压缩
* NULL:不压缩
*/
}
//替换现有的数据
//$mem->replace("t",time(),NULL,3);
//删除一个现有的缓存数据
//$mem->delete("t");
//清空缓存
//$mem->flush();
echo
$t;
//关闭与服务的连接
$mem
->
close();
?>
使用memcached的场景
想象有这么一个场景,一个电子商务网站,在网站的左侧会是商品的分类,中间是商品搜索结果的列表,可以查看商品信息和商家的基本信息和相关商家的信誉度信息。
在这个场景下,因为一个商场的类别不会经常改变的。实时性不是很高,这样应该放到缓存中取的。
一般时候做法:
执行一次或者多次sql从数据库中查询全站的商品分类---->>递归形成你所需的分类tree------>>进入处理数据------->>显示到页面上。
在使用 memcached做法:
第一次显示的时候:判断memcached缓存中是否有该分类----没有----->执行一次或者多次sql从数据库中查询全站的商品分类----->放到memcached中------->>进入处理数据------->>显示到页面
第二次显示的判断memcached缓存中是否有该分类----有--->>-从memcached中取出数据-------->>进入处理数据------->>显示到页面
当这个过程首次发生时,数据将正常地从数据库或其他数据源加载,然后再存储到 memcached 内。当下一次访问此信息时,它就会从 memcached 中取出,而不是从数据库加载,节省了时间和 CPU 循环。
但是要是数据中的数据改变怎么来更新memcached中的数据呢
过程为:更新数据库中分类的信息------->找到memcached中key值,删除------>重新插入到你的memcached中就可以了
memcached 内的存储操作是原子的,所以信息的更新不会让客户机只获得部分数据;它们获得的或者是老版本,或者是新版本。
面临的问题
对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题。特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的边缘也不远了。很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩 展性等方面的考虑,结果眼看着访问量一天天网上爬,可突然发现有一天网站因为访问量过大而崩溃了,到时候哭都来不及。所以我们一定要未雨绸缪,在数据库还 没罢工前,想方设法给它减负,这也是这篇文章的主要议题。
大家都知道,当有一个request过来后,web服务器交给app服务器,app处理并从db中存取相关数据,但db存取的花费是相当高昂的。特 别是每次都取相同的数据,等于是让数据库每次都在做高耗费的无用功,数据库如果会说话,肯定会发牢骚,你都问了这么多遍了,难道还记不住吗?是啊,如果 app拿到第一次数据并存到内存里,下次读取时直接从内存里读取,而不用麻烦数据库,这样不就给数据库减负了?而且从内存取数据必然要比从数据库媒介取快 很多倍,反而提升了应用程序的性能。
因此,我们可以在web/app层与db层之间加一层cache层,主要目的:1. 减少数据库读取负担;2. 提高数据读取速度。而且,cache存取的媒介是内存,而一台服务器的内存容量一般都是有限制的,不像硬盘容量可以做到TB级别。所以,可以考虑采用分布 式的cache层,这样更易于破除内存容量的限制,同时又增加了灵活性。