monoの開発ブログ

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

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

Gemfile

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

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

config.ru

rack-cacheを使う設定を追加。サーバのアドレスはMEMCACHE_SERVERSという環境変数で渡されるので、それを使います。ローカルで開発するときはMEMCACHE_SERVERSは存在しないので、かわりにファイルにキャッシュします。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であればキャッシュを返していることが分かります。

参考