3

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呼び出しをキャッシュしましたが、同じ3つのシナリオ(ホーム、クエリ、結果)で、APIモジュールコントローラーを呼び出しているコントローラーに結果をキャッシュする必要があると思いますか? そのようです:

    //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}ん(うまくいくと思いますが)

4

1 に答える 1

2

IMHO リアルタイム データが必要ない場合は、API の結果をキャッシュすることをお勧めします。新しいデータが 1 時間表示されなくてもかまわない場合は、必ず 1 時間キャッシュしてください。したがって、最初の質問としては、「アプリケーションのコンテンツはどれくらい新鮮である必要があるか?」と自問する必要があります。それに応じてキャッシュを実装します。

2 番目の質問: コンテンツが単純な方法で操作されているだけの場合、コンテンツをキャッシュする価値はあまりないと思います。その時点で、キャッシュ内のスペースを使い果たし、あまり価値がありません。ただし、そのデータを使用してデータベースまたはその他の API 呼び出しが行われている場合は、上記と同様の手法を使用してキャッシュする必要があります。

プロセッサーの負荷 (操作後にコンテンツをキャッシュする唯一の理由) が心配な場合は、VarnishCloudFrontなどを検討することをお勧めします。

于 2012-05-31T21:42:13.673 に答える