用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10147|回复: 19
收起左侧

[辅助方法 Helper] 骑兵系列:memcached和model结果集“智能”切换小助手

  [复制链接]
发表于 2011-8-12 22:47:26 | 显示全部楼层 |阅读模式
本人之前发起了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






评分

参与人数 3威望 +18 收起 理由
jeongee + 6 赞一个!
Hex + 6 很给力!
lamtin + 6 神马都是浮云

查看全部评分

发表于 2011-8-13 16:30:15 | 显示全部楼层
.........估计会太监...
发表于 2011-8-13 16:38:12 | 显示全部楼层
有步兵系列吗.........
发表于 2011-8-14 12:03:29 | 显示全部楼层
智齿一个,收啦
发表于 2011-8-14 13:33:33 | 显示全部楼层
visvoy 发表于 2011-8-14 12:03
智齿一个,收啦

visvoy 我把永远mm的头像骗到手了...........
发表于 2011-8-15 13:32:15 | 显示全部楼层
本帖最后由 zhouli520 于 2011-8-15 13:49 编辑

这么好的东西一定要顶

报错的话:
把memcache改成memcached 我忘了update了 改下  
mark下.
 楼主| 发表于 2011-8-22 13:28:04 | 显示全部楼层
zhouli520 发表于 2011-8-15 13:32
这么好的东西一定要顶

报错的话:

无需担心这个了。我已经在源代码里面做了更新。
发表于 2011-8-30 09:40:20 | 显示全部楼层
saturn 发表于 2011-8-22 13:28
无需担心这个了。我已经在源代码里面做了更新。

想请问下Memcached到底该怎么配置
说明文档里也没用具体配置方法,网上教程也看不太明白,我本地机器上是支持memcache的,但是就是搞不懂配置的问题,能具体看下你的配置文件是怎么写的麽
要不然每次在if( ! $CI->cache->memcached->is_supported())里就会判断不支持而直接连接数据库了
 楼主| 发表于 2011-8-30 11:56:33 | 显示全部楼层
zhouli520 发表于 2011-8-30 09:40
想请问下Memcached到底该怎么配置
说明文档里也没用具体配置方法,网上教程也看不太明白,我本地机器上是支 ...

首先,确认你安装的memcached Daemon正在运行(linux下用 ps aux | grep memcached 查看下是否存在该进程)
然后,确保你安装了memcached的php拓展:http://php.net/manual/en/book.memcached.php
最后,如果你有多个memcached服务器运行,添加一个config/memcached.php文件,然后类似如下进行配置:

PHP复制代码
$config['memcached'] = array(
        'default' => array(
                'hostname' => '127.0.0.1', // 服务器IP
                'port'           => 11211, // 服务的监听端口
                'weight'   => 1 // 权重
        )
);
复制代码


如果还是直接读取数据库,那就是你上面几步中出现了错误,或者程序写错了。
发表于 2011-8-30 17:38:50 | 显示全部楼层
赞一个

本版积分规则