RailsのActionCacheを配置するためのActiveSupport::Cache::Storeには、以下のようなものがあります。
(使ったことあるもののみ)
- FileStore
- MemoryStore
- MemCacheStore
- DalliStore
今回、キャッシュとしての使いやすさから、以下のようなものを探していました。
expires_inサポート
キャッシュなので、しばらくしたら消えてくれないと困ります。
Rails3.2のActiveSupport::Cache::Entryが対応していますが、これはread時にexpireしていたら削除するという方法なので、パフォーマンス上多少不利なほか、キーのパターンが非常に多い場合にキャッシュが肥大化する問題があります。
長いkeyサポート
基本的にURLをそのままkeyにしたいです。
検索ページなどで、1000文字を超えるURLが生成されることは十分ありそうです。
正規表現・prefixによる削除
URLでキャッシュしつつも、ニュースが更新されたらすぐに/news/*をすべて削除すると言った運用をしたいところです。
memcached系は、keyが250byte程度なのと、key一覧を取得できない(非常に重い)ため、非現実的です。
FileStoreは、長いファイル名がたまに問題を引き起こすほか、複数ホストで利用できないのが拡張性の点から不安です。
MemoryStoreは、同様に複数ホストで使えないのと、保存期間を制御しづらいのが使いにくい。
そこで、上記をすべて満たせるKyotoTycoonをキャッシュストアとして使うことにしました。
KyotoTycoonは、KyotoCabinetをネットワーク経由で利用できるようにしたものです。
TokyoTyrantの後継で、以下のような特徴を持っています。
- TokyoTyrantのように永続化できる
- HTTPベースのAPI(REST, RPC)
- memcached互換API、バイナリプロトコルもサポート
- expireをサポート
また、key一覧の取得(すべて・前方一致・正規表現)をサポートしているのも特徴です。
これぞまさに求めていたもの!
Pixiv、ドラクエX、ファイナルファンタジーなどの採用実績もあるようで、安心感もばっちり。
KyototycoonStore
ということで、キャッシュストアとして使えるKyotoTycoonのラッパーを作ってみました。といっても、ActiveSupport::Cache::Storeをコピペして少し書き換えただけですが...
https://github.com/babatakao/kyototycoon-store
接続には、kyototycoon-rubyを利用しています。
利用方法
# Gemfile gem 'kyototycoon-store', :git => 'git@github.com:babatakao/kyototycoon-store.git' # config/environments/development.rb config.action_controller.perform_caching = true config.action_controller.cache_store = :kyototycoon_store, 'localhost:1978', { expires_in: 600, namespace: 'SAMPLE' }
まだ試験運用中ですが、MANGA REBORNのキャッシュとして利用しています。
ちょくちょくバージョンアップ目指していこうと思います。
TODO:
現状、手抜きしてEntryをMarshalしているので、無駄に重い。
複数台での運用を試す。
KyotoTycoon自体のインストール方法は、丁寧に解説くださっている方がいるので、こちらを参照すると良いと思います(注: リンク更新しました)。