定义好的缓存方案

时间:2012-05-24 14:13:12

标签: php codeigniter caching apc

我需要知道我是否可以改进从我的CodeIgniter应用程序内部缓存api调用的方式。我现在这样做的方式是这样的,以hmvc模式:

  • 控制器HOME == 调用 => 模块app/application/modules/apis/controllers/c_$api == 加载库 => app/application/libraries/$api ==>库返回对模块controller_X的响应,控制器使用它拥有的数据调用视图

//注意:我的应用不使用twitter api,而是使用其他

apis模块内部是所有apc缓存发生的地方,如下所示:

    // Load up drivers
    $this->load->library('driver');
    $this->load->driver('cache', array('adapter' => 'apc'));

    // Get Tweets from Cache
    $tweets = $this->cache->get('my_tweets');

    if ( ! $tweets)
    {
        // No tweets in the cache, so get new ones.
        $url = 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name=gaker&count=5';

        $tweets = json_decode(file_get_contents($url));
        $this->cache->save('my_tweets',$tweets, 300);
    }

    return $tweets;

如本文所述:http://www.gregaker.net/2011/feb/12/codeigniter-reactors-caching-drivers/

所以我想知道:

  1. 有3个场景:家庭,查询,结果;在每个模块apis的控制器中,您认为为所有场景实现每个控制器的缓存是一个好主意吗?例如:

    //for each api1, api2 ... apiX, apply this:
    
    //home
    $this->cache->save('api_home',$api_home, 300);
    
    //query
    $this->cache->save("api_$query", $api_{$query}, 300); // I don't know for sure if $api_{$query} works or not, so don't hang me because I haven't tried it.
    
    //result
    $this->cache->save("api_$queryId", $api_{$queryId}, 300);
    
  2. 即使我缓存了api调用,你认为我应该将结果缓存在调用api模块控制器的控制器中,具有相同的3个场景(主页,查询和结果)吗?像这样:

    //modules/{home,fetch,article}/controllers/{home,fetch,article}.php
    
    //home
    $homeData['latest'][$api]   = modules::run("apis/c_$api/data", array('action'=>'topRated'));
    $this->cache->save('home_data', $home_data, 300);
    
    //query
    $searchResults[$api] = modules::run("apis/c_$api/data", $parameters);
    $this->cache->save("search_results_$query", $search_results_{$query}, 300);
    
    //article page
    $result = modules::run("apis/c_$api/data", $parameters);
    $this->cache->save("$api_article_$id", ${$api}_article_{$id}, 300);
    
  3. 那么,您怎么看?这是上面提到的好习惯,还是只是一个可怕的愚蠢行为?

    //注意,建议的缓存思想没有经过测试......所以,我不知道${$api}_article_{$id}是否有效(即使我认为它会有效)

1 个答案:

答案 0 :(得分:1)

恕我直言如果您不需要实时数据,最好缓存api结果。如果您不在乎您不会在一小时内看到新数据,那么请务必将其缓存一小时。因此,对于您的第一个问题,您只需要问问自己:“我的应用程序需要的内容有多新鲜?”并相应地实现缓存。

对于第二个问题:如果仅以简单的方式操作内容,我认为缓存内容没有太多价值。那时你正在占用缓存中的空间并且没有获得很多价值。但是如果有数据库,或者使用该数据进行其他api调用,那么应该使用类似于上面的技术来缓存它们。

如果您担心处理器负载(操作后缓存内容的唯一原因),最好的办法是查看VarnishCloudFront之类的内容。