浸染:对付一个日访问量达到百万级的门户网站,速率快慢很大程度上决定了网站的收入。除了优化网站内容显示策略外,提升网站速率最好的方法便是“静态缓存/动态缓存”技能。
静态缓存:动态页面转换成静态页面,速率将提升2至10倍,如:文件缓存技能(传统手段);如果静态页面能够缓存到内存里,速率将提升2至3个数量级,如:memCACHE缓存技能(盛行);
动态缓存:即,局部缓存,进将不须要实时更新的数据缓存,并不是全体页面;
二、缓存的方法紧张要哪些?
静态缓存:缓存的是全体页面;
动态缓存:缓存的是页面的局部,即,局部缓存;
局部不缓存:利用js、Ajax(异步)实现缓存页面的局部不缓存
三、基于ThinkPHP的缓存实现
(1)静态缓存、动态缓存、局部不缓存的含义/用场
静态缓存:天生静态页面——缓存的是全体页面;
动态缓存:仅对数据库中的数据进行了缓存,即“通过动态缓存,不须要再读取数据库了,直接通过缓存文件来调取相应数据”;
局部不缓存:实现缓存页面中某一部分不缓存,如:登录/退出、点击量;
(2)静态缓存的实现,在config.php文件中作如下配置:
//开启静态缓存(默认保存在Html/文件夹中)
'HTML_CACHE_ON'=>true,
'HTML_CACHE_RULES'=> array(
//''=>array('{$_SERVER.REQUEST_URI|md5}','30'), //根据当前的URL进行缓存
/
…更多操作的静态规则
'掌握器名/方法名' => array('缓存文件的名称','静态缓存有效期','附加规则'),
{:module}:掌握器名
{:action}:方法名
{id}:get参数值
/
'Show:index'=>array('{:module}_{:action}_{id}',0),//0:永久有效
),
(3)动态缓存的实现:两种办法(文件缓存、memecache缓存)
1、文件缓存(默认办法)
ThinkPHP的S()函数将“从数据库中得到的数据”缓存到“文件”中;
缓存文件默认保存到“Runtime/Temp/”文件夹中;
存数据格式:S('缓存名称','缓存数据','缓存韶光');
存数据:S('index_list',$list,10); // $list:从数据库中读取的数据
读数据:S('index_list'); // 直接从缓存文件读取,不再经由数据库
2、memecache缓存
第一步:安装Memcached
第二步:memecache缓存配置(在config.php文件中作如下配置:)
//开启动态缓存(memecache缓存)
'DATA_CACHE_TYPE'=>'Memcache',//缓存类型
'MEMCACHE_HOST'=>'localhost',//本地做事器地址
'MEMCACHE_PORT'=>11211,//默认端口
'DATA_CACHE_TIME'=>3600,//全局缓存韶光:特殊把稳这里不要加引号,否则将不起浸染!
!
!
第三步:通过S()函数实现“动态缓存”
ThinkPHP的S()函数将“从数据库中得到的数据”缓存到“内存”中;
存数据:S('index_list',$list,10);
读数据:S('index_list')
3、redis缓存
第一步:安装redis及php-redis拓展
详见其余两篇文章
第二步:redis缓存配置
//动态缓存配置:
'DATA_CACHE_TIME'=>3600,
//开启动态缓存(Redis缓存)
'DATA_CACHE_TYPE'=>'Redis',
'REDIS_HOST'=>'127.0.0.1',
'REDIS_PORT'=>6379,//默认端口
第三步:通过cache()函数实现“动态缓存”
1 缓存初始化
cache(array('type'=>'xcache','expire'=>60));
2 缓存设置
cache('a',$value);
3 缓存读取
$value = cache('a');
4 缓存删除
cache('a',null);
拓展:利用查询缓存办法实现动态缓存
对付及时性哀求不高的数据查询,我们可以利用查询缓存功能来提高性能,而且无需自己利用缓存方法进行缓存和获取。
新版内置的查询缓存功能支持所有的数据库,并且支持所有的缓存办法和有效期。
在利用查询缓存的时候,只须要调用Model类的cache方法,例如:
$Model->cache(true)->select();
如果利用了cache(true) ,则在查询的同时会根据当前的查询SQL天生查询缓存,默认情形下缓存办法采取DATA_CACHE_TYPE 参数设置的缓存办法(系统默认值为File表示采取文件办法缓存),缓存有效期是DATA_CACHE_TIME 参数设置的韶光,也可以单独制订查询缓存的缓存办法和有效期:
$Model->cache(true,60,'xcache')->select();
表示当前查询缓存的缓存办法为xcache,并且缓存有效期为60秒。
同样的查询,如果没有利用cache方法,则不会获取或者天生任何缓存,即便是之前调用过Cache方法。
查询缓存只是供内部调用,如果希望查询缓存开放给其他程序调用,可以指定查询缓存的Key,例如:
$Model->cache('cache_name',60)->select();
则可以在外部通过S方法直接获取查询缓存的内容,
$value = S('cache_name');
除了select方法之外,查询缓存还支持find和getField方法,以及他们的衍生方法(包括统计查询和动态查询方法)。详细运用的时候可以根据须要选择缓存办法和缓存有效期。
(4)动态缓存运用实例
public function index(){
if(!$list=S('index_list')){
//echo 111;//测试是否进行了动态缓存
$list=M('cate')->where(array('pid'=>0))->order('sort')->select();
S('index_list',$list,10);
}
$this->cate=$list;
$this->display();
}
(5)局部不缓存的实现:两种办法(JavaScript、异步)
1、JavaScript
前台模板:
<span>点击量<script src=\"大众{:U('Show/hitsCount',array('id'=>$blog['id']))}\"大众></script>次</span>
后台掌握器:
public function hitsCount(){
$id=I('id');
//点击次数:每次打开博文后点击次数+1
//(当然也可以设置一个IP地址只能增加一次:记录用户的IP就显得很主要了)
$where=array('id'=>$id);
$hits=M('blog')->where($where)->getField('hits');
M('blog')->where($where)->setInc('hits');//如果增2:setInc('hits',2)
echo 'document.write('.$hits.')';//这一步很关键:得到的数据赋值给前台静态缓存页面
}
2、异步
详见本教程中的文章:异步操作(Ajax要求)