Chris Mendez in For Developers, Ruby, Heroku

Heroku: Working with Memcache

You can use memcache on your Heroku dyno through addons such as Memcachier. If you're working in development mode, Memcachier provides up to 25mb for free. Here's how to get started.

This article assumes that you've already prepared your Rails app for Heroku deployment. If not, read this article first.


Step 1 - Configure Heroku

Change directory into your Heroku app.

cd ~/path/to/rails_app  

Add Memcachier through the Heroku command line.

heroku addons:add memcachier  

Open up the documentation.

heroku addons:docs memcachier  

That's it! The following steps are pretty much straight from the instructions found in Getting started with Memcachier and Rails 4.


Step 2 - Configure Gemfile

Add this to your Gemfile.

gem 'dalli'  

Run bundle install

bundle install  

Step 3 - Configure Your Environment

When you add Memcachier to Heroku, it auto created a few Environmental Variables. To complete the setup, all you need to do is paste this into config/environments/production.rb

  # Memcachier / dalli configuration
  config.cache_store = :dalli_store,
    (ENV["MEMCACHIER_SERVERS"] || "").split(","),
    {:username => ENV["MEMCACHIER_USERNAME"],
      :password => ENV["MEMCACHIER_PASSWORD"],
      :failover => true,
      :socket_timeout => 1.5,
      :socket_failure_delay => 0.2,
      :down_retry_delay => 60
    }

Step 4 - Fragment Caching

There are three types of caching; Whole Site caching, per-view caching and fragment caching. Source

I use fragment caching the most on specific parts of my view such as tables,

- cache "keywords_index_table", skip_digest: true do

If you want your fragment to have an expiration, here's how.

- cache "keywords_show_id_#{@keyword.id}_page_#{params[:page]}", skip_digest: true, expires_in: 5.minutes do

If the cache within your view is making a request to a specific model, you'll need to add the cache to the Model too.

# Memcachier that clears a fragment
ActionController::Base.new.expire_fragment('keywords_index_table')