Tokyo Tyrantも似たようなコンセプトなのだが、TTはキャッシュサーバではない。キャッシュサーバには、一定時間が経過したら消えるレコードを格納することで空間使用量を一定に保つという「expiration」機能が求められるのだが、TTはそれを自身では実装していない。つまり、TTは「キャッシュ」というよりも「簡易ストレージ」といった位置づけの製品だと言える。
ああ、確かに。
TokyoTyrantをキャッシュサーバとして利用する場合、明示的に削除するか、指定した容量を超過して削除されるのを待つかであったので、キャッシュサーバとして使うためには一工夫必要でした。
例えばこんな感じで。
[Rails]ビューキャッシュにTokyoTyrantを使ってHTMLを高速に表示する | KRAY Inc
一度キャッシュしたHTMLを失効するには、明示的にexpire_fragment(キャッシュ名)メソッドを実行する必要があります。例えば10分間だけキャッシュさせたい場合、キャッシュストレージにMemcachedを利用していると、cache(キャッシュ名, :expires_in => 10.minutes) というような書き方が可能なので便利です。
TokyoTyrantを利用している場合(:file_storeでも)、キャッシュ名に有効期間のスタンプを付けておくことで、擬似的な有効期限を設けてみます。
KyotoTycoonは始めからキャッシュサーバとしての利用を想定されているので、expiration(キャッシュ生存期間)を設定して使用出来ます。便利。もちろんその分パフォーマンスは低下します。memcached → TokyoTyrantは「永続化」という点がパフォーマンス低下の要因になりましたが、TokyoTyrant → KyotoTycoonは「expiration機能」がパフォーマンス低下の要因になっているようです。
それぞれの速度比較についてはこちらのベンチマークが参考になります。
Memcached互換永続KVS TokyoTyrant, KyotoTycoonのベンチマーク(Ruby) | Cloud Berry
ざっくり言って、こんな感じでしょうか。
- set
- memcached >> TokyoTyrant > KyotoTycoon
- get
- memcached > TokyoTyrant = KyotoTycoon
ファイルキャッシュがメモリキャッシュに敵わないのは当然なのですが、それでも随分早いですね。
(memcached互換を使用しなければもっと早いのかな?)
メモリを十分に積んだサーバを使用出来る場合はともかく、個人プロジェクトの場合にはメモリを十分に積むのはコスト的な意味で難しいと感じています。月額料金が4倍とかなりますからねぇ…その点、HDDなら低価格でも十分に詰めます。個人的には永続化よりもそういう理由でmemcached互換を選んでしまいがちです。
…まぁ、HDDよりディスクI/Oの方が逼迫するだろとも思いますけどもね。。
(mmapで軽減出来るようになってますがVPSでメモリも2GBしかないので)
以上簡単ですが、KyotoTycoonとTokyoTyrantの違いでした。