我需要知道我是否可以改进从我的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/
所以我想知道:
有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);
即使我缓存了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);
那么,您怎么看?这是上面提到的好习惯,还是只是一个可怕的愚蠢行为?
//注意,建议的缓存思想没有经过测试......所以,我不知道${$api}_article_{$id}
是否有效(即使我认为它会有效)
答案 0 :(得分:1)
恕我直言如果您不需要实时数据,最好缓存api结果。如果您不在乎您不会在一小时内看到新数据,那么请务必将其缓存一小时。因此,对于您的第一个问题,您只需要问问自己:“我的应用程序需要的内容有多新鲜?”并相应地实现缓存。
对于第二个问题:如果仅以简单的方式操作内容,我认为缓存内容没有太多价值。那时你正在占用缓存中的空间并且没有获得很多价值。但是如果有数据库,或者使用该数据进行其他api调用,那么应该使用类似于上面的技术来缓存它们。
如果您担心处理器负载(操作后缓存内容的唯一原因),最好的办法是查看Varnish或CloudFront之类的内容。