RailsのキャッシュにKyotoTycoonを使えるkyototycoon-storeを作ってみた

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自体のインストール方法は、丁寧に解説くださっている方がいるので、こちらを参照すると良いと思います(注: リンク更新しました)。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(15区分 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、CITP、Ruby Programmer Goldなどを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ