memcached再入門

memcachedを本格的に使う必要に迫られたので、ここでちゃんと理解しておくべく色々調べた。

memcachedとは?

本家サイトのイントロダクションから抜粋

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Memcached is simple yet powerful. Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches. Its API is available for most popular languages.

高性能な分散キャッシュシステムで、key-value形式のデータをオンメモリで保持する。

利用する上で理解しておくべきこと

何でもかんでもmemcachedに入れればいいわけじゃなく、ミドルウェアはちゃんと特徴を理解し、適切なシーンで使う必要がある。memcachedに限った話じゃないけど。

キャッシュサーバである

名前から分かるようにキャッシュであってストレージではない。
よって、ストレージ(ファイルなりDBなり)の前段にmemcachedを置いて、読み出し処理の負荷軽減するのが本筋であって、memcachedだけにデータ入れておくのはNG。

オンメモリである

サーバがダウンしたらデータは消えてしまう。また、あらかじめ指定してあるメモリを超えてしまう場合は、LRU(Least Recently Used)アルゴリズムに基づいて古いデータからパージされていく。
このためmemcachedに問い合わせてもミスヒットする前提でプログラムを組まなければならない。

分散はクライアント側

memcachedはサーバ側に分散する機構を持たず、クライアント側に任されている。クライアントの分散方式を理解し、適切なものを選択する必要がある。


なのでmemcachedに向いてるのは

  1. 参照頻度が高いが、更新頻度は高くない
  2. 最新データが反映されるまでの遅延がある程度許容できる

という条件を満たすデータと考えられる。例えば、ユーザデータやランキングなど。


分散方式について

perlのクライアントライブラリについて整理してみる。

Cache::Memcached

keyのCRCを求め、そのサーバ台数の剰余により保存するサーバを決める。
シンプルだが、サーバ増設すると保存サーバが変わってしまうため、その瞬間のキャッシュヒット率が落ちてしまう問題あり。

Cache::Memcached::Fast

Consitent Hashingというアルゴリズムに基づいて分散サーバを決める。
サーバ増設ないしサーバダウンした時のキャッシュミスヒットを限定できる、というのが大きなポイント。

# これだけで1エントリーにできそうな感じなので、後日ちゃんと調べる(予定)
# あとソースも覗いてみたい。こっちが先かな