骑兵系列:memcached和model结果集“智能”切换小助手
本人之前发起了CI 101教程系列,但是不小心太监了。对此,我表示很悲催。从今天开始,我会不定期发布一些个人觉得非常有用的CI代码片段,并给出一些适用提示。相信这个系列不会太监(你相信咩?),毕竟发布代码片段比发布教程时间成本要低得多。这个系列叫做“骑兵系列”。{:soso_e151:}在实际项目中,我们可能会经常碰到使用缓存的情况,于是类似下面逻辑的代码就出现了:
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函数:
$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
.........估计会太监... 有步兵系列吗......... 智齿一个,收啦 visvoy 发表于 2011-8-14 12:03 static/image/common/back.gif
智齿一个,收啦
visvoy 我把永远mm的头像骗到手了........... 本帖最后由 zhouli520 于 2011-8-15 13:49 编辑
这么好的东西一定要顶
报错的话:
把memcache改成memcached 我忘了update了 改下
mark下.
zhouli520 发表于 2011-8-15 13:32 static/image/common/back.gif
这么好的东西一定要顶
报错的话:
无需担心这个了。我已经在源代码里面做了更新。 saturn 发表于 2011-8-22 13:28 static/image/common/back.gif
无需担心这个了。我已经在源代码里面做了更新。
想请问下Memcached到底该怎么配置
说明文档里也没用具体配置方法,网上教程也看不太明白,我本地机器上是支持memcache的,但是就是搞不懂配置的问题,能具体看下你的配置文件是怎么写的麽
要不然每次在if( ! $CI->cache->memcached->is_supported())里就会判断不支持而直接连接数据库了 zhouli520 发表于 2011-8-30 09:40 static/image/common/back.gif
想请问下Memcached到底该怎么配置
说明文档里也没用具体配置方法,网上教程也看不太明白,我本地机器上是支 ...
首先,确认你安装的memcached Daemon正在运行(linux下用 ps aux | grep memcached 查看下是否存在该进程)
然后,确保你安装了memcached的php拓展:http://php.net/manual/en/book.memcached.php
最后,如果你有多个memcached服务器运行,添加一个config/memcached.php文件,然后类似如下进行配置:
$config['memcached'] = array(
'default' => array(
'hostname' => '127.0.0.1', // 服务器IP
'port' => 11211, // 服务的监听端口
'weight' => 1 // 权重
)
);
如果还是直接读取数据库,那就是你上面几步中出现了错误,或者程序写错了。 赞一个
页:
[1]
2