|
本人之前发起了CI 101教程系列,但是不小心太监了。对此,我表示很悲催。从今天开始,我会不定期发布一些个人觉得非常有用的CI代码片段,并给出一些适用提示。相信这个系列不会太监(你相信咩?),毕竟发布代码片段比发布教程时间成本要低得多。这个系列叫做“骑兵系列”。{:soso_e151:}
在实际项目中,我们可能会经常碰到使用缓存的情况,于是类似下面逻辑的代码就出现了:
PHP复制代码
if (缓存已经存在 )
// data is cached
return 缓存的结果集 ;
end;
if(缓存不存在或过期 )
// data is not cached
从model提取数据 ();
将结果集保存到缓存中 ;
return 结果集 ;
end
复制代码
实际的代码可能比这个要多一些,因为我们还需要包含比如:系统是否支持缓存的逻辑判断;输入参数的合法性检查等等。
如果需要用到缓存的地方还不多,上面的代码没有任何问题。但是如果我们需要在很多地方使用到缓存,上面这种缓存是否存在的判断逻辑会频繁出现。出现太多逻辑判断代码不是神马好事情,它会增加审查成本。(我本人非常讨厌 else 这个关键字的出现!如果你的代码段中出现大量的 if...else...elseif...,那么以我的经验来看,需要优化重构的空间还有很大。)
本着DRY的理念,我写了今天这个代码段:将缓存存在判断逻辑写成helper函数——实现缓存数据与来自Model的数据之间的自动切换操作。
看看代码:https://gist.github.com/1142184#file_query_cache.php
在需要用到缓存的地方调用这个helper函数:
PHP复制代码
$data = query_cache (
'sample_key', // 缓存的key
'posts_mdl', // 数据model的名称
'get_many', // 数据model对应的方法名称
array($id), // 方法的参数
1296000 // 缓存renew周期
);
复制代码
代码我已经做了非常清晰的注释,如有疑问请大家直接阅读。
Update: 有同学反映看不太懂,特别是没有接触CI 2.0的同学。代码里面我用到了CI 2.0(Reactor)支持的Cache driver,在使用前请保证已加载这个driver。
Update 2: 9楼有memcached的配置说明,还有问题请直接提出来。
关于Cache Driver的文档:http://codeigniter.org.cn/user_guide/drivers/caching.html
|
评分
-
查看全部评分
|