ActiveSupport::Cache

目次

試した環境

$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
$ bundle exec ruby -r active_support -e 'puts ActiveSupport::VERSION::STRING'
4.0.0

キャッシュ機能を提供するモジュール。

実際には ActiveSuport::Cache::Store の継承クラスによってキャッシュの管理が行なわれる。 使うクラスによってキャッシュの保存先を変えられる。 Store の種類には以下のものがあります。

などなどあります。

また Middleware もあり機能強化もできるようです。

この LocalCach は現状すべての Store に利用されているようです。

cache を作成して、キャッシュがなければ、readnil を返します。 キャッシュに書き込みする場合は write を使います。

require 'active_support/cache'
cache = ActiveSupport::Cache::MemoryStore.new

cache.read('country')            # => nil
cache.write('country', 'Japan')
cache.read('country')            # => 'Japan'

FaileStore を利用した場合は、プロセスを終了してもキャッシュが残ります。

ActiveSupport::Cache

.lookup_store

利用するキャッシュストアを指定すると必要なクラスを読み込みして new したものを返してくれる模様。

第1引数には :memory_store といったシンボルを渡し、第2引数以降は new するときの引数として利用される。

.expand_cache_key

:namespace/:app_id/:key1/:key2 のようなキャッシュキーを生成する。 引数 namespace が先頭にやってきて、:app_id には、ENV[“RAILS_CACHE_ID”] または ENV[“RAILS_APP_VERSION”] の値が利用される。

引数key にはリストやオブジェクトも渡せる。cache_key というメソッドがあれば、これを使い変換する。配列のばあいは再帰的によびだす。そうでない場合は to_param で変換します。

ActiveSupport::Cache::Store

抽象クラスなので継承して使います。

#silence!

サイレンスモードをオンにする。

#mute

このメソッドにブロックで渡した部分はサイレンスモードで実行されます。

.instrument

true のとき、通知を発生させるようになります。 デフォルトは false

#fetch

name をキーにキャッシュをを取り出します。 ブロックを渡した場合、キャッシュがなければその値をキャッシュします。 ブロックがない場合は read メソッドと同じです。

options には :namespace, :compress, :compress_threshold, :expires_in, :race_condition_ttl が使用できます。

#read

name をキーにしたキャッシュに保存された値を取り出します。 キャッシュにヒットしたかどうかを通知する際に情報を付加します。 .instrumenttrue であれば、cache_read.active_supporという通知が発生します。 通知のpayload:hit というエントリが追加され truefalse を返します。

#read_multi

複数のキーをまとめてキャッシュから取り出し、ハッシュで値を返します。 通知は発生しない。

#fetch_multi

複数のキーをまとめてキャッシュから取り出し、ハッシュで値を返します。 値が見付からない場合は渡したブロックを実行して戻り値をキャッシュします。 ブロックには key が渡され、キーごと処理を変えることができます。

#write

name をキーに value をキャッシュとして保存します。 .instrumenttrue であれば、cache_write.active_supporという通知が発生します。

#delete

name をキーとしたキャッシュを削除します。 .instrumenttrue であれば、cache_delete.active_supporという通知が発生します。

#exist?

name をキーとしたキャッスが存在するか確認します。 .instrumenttrue であれば、cache_exist?.active_supporという通知が発生します。

#delete_matched

マッチするエントリーをすべて削除する。 サブクラスでオーバーライドされることを期待している。 オーバライドされてない場合はその Store ではサポートされません。

#increment

エントリーの値を増加させる。 サブクラスでオーバーライドされることを期待している。 オーバライドされてない場合はその Store ではサポートされません。

#decrement

エントリーの値を現象させる。 サブクラスでオーバーライドされることを期待している。 オーバライドされてない場合はその Store ではサポートされません。

cleanup

無効になっているキャシュを破棄する。 サブクラスでオーバーライドされることを期待している。 オーバライドされてない場合はその Store ではサポートされません。

clear

キャッシュを破棄する。 サブクラスでオーバーライドされることを期待している。 オーバライドされてない場合はその Store ではサポートされません。

key_matcher

protected メソッド。 引数パターンを namespace オプションに対応できるように再作成する。

read_entry

protected メソッド。 サブクラスで実装する必要のあるメソッド。 引数 key に対応した情報を取り出す。

write_entry

protected メソッド。 サブクラスで実装する必要のあるメソッド。 引数 key に情報を保存する。

#merged_options

privateメソッド。 コンストラクタで設定されたオプションと各メソッドで渡されたオプションをマージした結果を返します。コピーされたものを返すので、利用する側は自由に書き換えられます。

オプションには :namespace, :compress, :compress_threshold, :expires_in, :race_condition_ttl が使用できます。

expires_in はオプションのキャッシュ有効期限を設定します。

namespace はキャッシュのキーにprefix をつけて切り換えることができます。 ブロックを渡しておくと、必要な時に実行してnamespaceを切り替えることができます。

expanded_key

private メソッド。 引数key をパラメータ化する。 cache_key というメソッドがあればこの値を返す。

namespaced_key

オプション namespace を反映した key へと変換する。

instrument

通知を作成する。 引数operatoion に応じた通知が発生します。 key はpayloadに追加され 通知先に伝搬されます。

log

ログを出力する。 operation 応じた情報を付与する。

find_cached_entry

fetch を利用した場合の read 処理を行う。

handle_expired_entry

期限の切れたエントリを処理する。 オプションrace_condition_ttl が設定している場合、再エントリされる。 そうでない場合は破棄されてしまう。

get_entry_value

fetch で利用される。 fetch_hit という通知を発生する。

save_block_result_to_cache

fetch で利用される。 キャッシュがヒットしなかった場合に値が保存するものがあれば実行される。

ActiveSupport::Cache::Entry

キャッシュのエントリを表現するクラス。値と有効期間の情報を持つ。有効期間は race_condition_ttl オプションで利用されます。

DEFAULT_COMPRESS_LIMIT

このサイズより大きい値は圧縮をする。 デフォルトは16キロバイト。 compress_threshold オプションで調整可能。

#initialize

value を格納する。 オプションには expires_in が指定できる。 どのくらい有効期間があるかを設定する。

#value

値を取り出す。

#expired?

期限が切れているか確認する。

#expires_at

期限が切れる時刻を返す。

#expires_at=

期限がきれる時刻を value に設定する。

#size

値のサイズを取得します。

#dup_value!

値をコピーします。