saturn 发表于 2011-8-12 22:47:26

骑兵系列: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






yeseason 发表于 2011-8-13 16:30:15

.........估计会太监...

yeseason 发表于 2011-8-13 16:38:12

有步兵系列吗.........

visvoy 发表于 2011-8-14 12:03:29

智齿一个,收啦

yeseason 发表于 2011-8-14 13:33:33

visvoy 发表于 2011-8-14 12:03 static/image/common/back.gif
智齿一个,收啦

visvoy 我把永远mm的头像骗到手了...........

zhouli520 发表于 2011-8-15 13:32:15

本帖最后由 zhouli520 于 2011-8-15 13:49 编辑

这么好的东西一定要顶

报错的话:
把memcache改成memcached 我忘了update了 改下
mark下.

saturn 发表于 2011-8-22 13:28:04

zhouli520 发表于 2011-8-15 13:32 static/image/common/back.gif
这么好的东西一定要顶

报错的话:


无需担心这个了。我已经在源代码里面做了更新。

zhouli520 发表于 2011-8-30 09:40:20

saturn 发表于 2011-8-22 13:28 static/image/common/back.gif
无需担心这个了。我已经在源代码里面做了更新。

想请问下Memcached到底该怎么配置
说明文档里也没用具体配置方法,网上教程也看不太明白,我本地机器上是支持memcache的,但是就是搞不懂配置的问题,能具体看下你的配置文件是怎么写的麽
要不然每次在if( ! $CI->cache->memcached->is_supported())里就会判断不支持而直接连接数据库了

saturn 发表于 2011-8-30 11:56:33

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 // 权重
      )
);

如果还是直接读取数据库,那就是你上面几步中出现了错误,或者程序写错了。

lnlingyuan 发表于 2011-8-30 17:38:50

赞一个
页: [1] 2
查看完整版本: 骑兵系列:memcached和model结果集“智能”切换小助手