takedajs ログ

備考録

CodeIgniterでMemcachedを検証する

CodeIgniterでMemcachedの利用前後での速度比較を行いました。
サーバにMemcachedが導入され、PHPと連携ができていることを前提に今回の記事を書いています。 まだできていない方は、前回書いた記事を参考にMemcachedPHPとの連携まで行ってください。

環境

  • Vagrantで構築
  • CodeIgniter Version 3.1.0

Memcachedが利用できるか確認

application/config/memcached.phpに以下を追記します。
['memcached']以外のところはデフォルトですでに記述されています。

$config['memcached'] = array(
        'default' => array(
                'hostname' => '127.0.0.1',
                'port'     => '11211',
                'weight'   => '1',
        ),
);

適当なコントローラーに以下のようなコードを書いて、Memcachedドライバーが利用できるか確認します。

public function index() {
    $this->load->driver('cache', array('adapter' => 'memcached'));

    if ($this->cache->is_supported('memcached')) {
        var_dump("成功");
    } else {
        var_dump("失敗");
    }
}

検証用コード

Memcachedにkey名がcountのデータがないときに、1億回ループした値を保存しています。 既にデータが保存されている場合は、保存されている値を表示させます。 今回、CI_Benchmarkクラスを利用してベンチマークを取っています。

public function index()
{
    $this->load->driver('cache', array('adapter' => 'memcached'));

    $this->benchmark->mark('my_mark_start');

    if (!$count = $this->cache->get("count")) {
        $count = 0;
        //1億回ループ
        for ($i = 0; $i < 100000000; $i++) {
            $count += 1;
        }
        //キャッシュに60秒保持
        $this->cache->save("count", $count, 60);
    }

    $this->benchmark->mark('my_mark_end');

    print "カウント数:" . $count . "<br />";
    print "秒数:" . $this->benchmark->elapsed_time('my_mark_start', 'my_mark_end');
}

検証結果

Memcached利用前後での処理速度の結果です。 1億回のループ分早くなっていることが分かります。 サイトパフォーマンス的にキャッシュは本当偉大ですね。

Memcached利用前

Memcached利用後

まとめ

過去に検証した、CodeigniterのWebページキャッシュに比べ、apiのレスポンス単位でキャッシュができるので、使い勝手が良さそうです。 キャッシュするときのkey名や保持する時間に関しては、導入するサイト毎でどうするか考える必要がありますね。

Memcachedは少し前まではよく聞くワードだったのですが、最近はRedisの方がよく聞きます。 今後、CodeigniterのRedisを使ったキャッシュの検証やMemcachedを利用したときの違いなどを調査してみたいと思います。