CodeIgniterでMemcachedの利用前後での速度比較を行いました。
サーバにMemcachedが導入され、PHPと連携ができていることを前提に今回の記事を書いています。
まだできていない方は、前回書いた記事を参考にMemcachedのPHPとの連携まで行ってください。
環境
- 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を利用したときの違いなどを調査してみたいと思います。