PHP
Memcached

今更ではあるが、memcachedについて学習してみた

概要

NoSQL界隈ではRedisやCassandra、Couchbassが流行りと見受けられる。
だが、今回は業務で利用している、memcachedについて改めて学習したことをまとめていく。

memcachedとは?

memcachedとは分散型キャッシュシステムを構築することができるソフトウェアである。
kvsの方式でデータを保存することができ、メモリ上にデータを保存するNoSQL。

kvsとは?
データの保存・管理手法の一つ。
任意の値(value)に対して対応する標識(key)を設定して保存する方法。

特徴

  • メモリ上にデータを保存しているため、データの書き込み・読み込みが早い。
  • RDBと組み合わせる事で、RDBの読み込みの負担を軽減できる。
  • クライアントライブラリで分散処理を実装できる。
  • メモリ上にデータを保存しているため、memcachedの再起動を行うとデータがリセットされる。
  • 設定した容量を超えると利用されないキャッシュから順番に消える(LRU)。
LRUとは?
未使用の時間が最も低いものを判定するアルゴリズム

分散処理について

memcachedはクライアントライブラリで分散処理を実装することが出来る。
分散処理はキーごとにサーバを使い分けることで実現している。
呼び出しも同様のアルゴリズムとなっている。

分散処理の例

PHPのクライアントライブラリ

memcache

特徴

  • PHP4.3.3以上で使用可能
  • インストール時に他のライブラリに依存しない

memcached

特徴

  • PHP5.2.0以上で使用可能
  • インストール時にlibmemcachedモジュールが必要
  • memcacheより利用できるメソッドが多いらしい

導入

memcached

導入方法はソースでのインストールやyumでのインストールがある。

今回はyumでのインストールを行う。

yum install -y memcached

PHPライブラリ

PHPライブラリも同様にyumでインストールできる。
サーバのPHPバージョンに合わせること。
今回は動作確認のためにmemcacheとmemcachedの両方をインストールするが、ライブラリはどちらか一つを入れれば問題ない。

yum install -y php72-php-pecl-memcache
yum install -y php72-php-pecl-memcached

あとは他のextensionと同様にphp.iniに追加する。

extension=memcache.so
extension=memcached.so

これで動くはずだったが、下記のWarningが発生した。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/memcached.so' - /usr/lib64/php/modules/memcached.so: undefined symbol: memcached_touch in Unknown on line 0

こちらを参考に対応し、正常に動作するようになった。

速度比較

PHPライブラリの読み込みと書き込みの速度を比較してみる。
実行結果を見ると僅かな差で Memcachedが勝っているようにみえる。

ライブラリ名 書き込み 読み込み
Memcache 0m23.270s 0m21.703s
Memcached 0m19.938s 0m19.213s

ソースコードはこちら

参考資料

PHPのMemcachedモジュールをインストール
http://takashi-kun.hatenablog.com/entry/2013/11/23/031343