monolithic kernel

HerokuのCedarスタックでキャッシュ

April 13, 2012

    CedarスタックだとVarnishが動かないのでmemcachedにキャッシュするメモ。

    Gemfile

    rack-cacheとmemcachedクライアントのdalliを追加。

    gem 'rack-cache', require: 'rack/cache'
    gem 'dalli'

    config.ru

    rack-cacheを使う設定を追加。サーバのアドレスはMEMCACHESERVERSという環境変数で渡されるので、それを使います。ローカルで開発するときはMEMCACHESERVERSは存在しないので、かわりにファイルにキャッシュします。default_ttlは個別に指定しなかったときのキャッシュ時間です。

    use Rack::Cache,
      verbose:     true,
      default_ttl: 30 * 60,
      metastore:   ENV['MEMCACHE_SERVERS'] ? "memcached://#{ENV['MEMCACHE_SERVERS']}/meta" : 'file:tmp/cache/rack/meta',
      entitystore: ENV['MEMCACHE_SERVERS'] ? "memcached://#{ENV['MEMCACHE_SERVERS']}/body" : 'file:tmp/cache/rack/entity'

    アプリ

    アプリ側でCache-Controlヘッダを付けるとそれを参照してキャッシュしてくれます。以下はSinatraでの例です。

    get '/' do
      cache_control :public, :max_age => 6 * 60 * 60
    end

    設定

    memcacheのaddonを追加します。

    $ heroku addons:add memcache

    動作確認

    レスポンスのX-Rack-Cacheヘッダで動作を確認できます。miss, storeと表示されればキャッシュされており、freshであればキャッシュを返していることが分かります。

    参考