Knowledge Base/Engine Yard Cloud Documentation/Customize

Add Redis to Your Application

Engine Yard
posted this on February 16, 2012 10:02 AM

Updated: February 24th, 2014

Redis is an open source, advanced key-value store. It is often referred to as a data structure server because keys can contain strings, hashes, lists, sets, and sorted sets.

This page describes getting Redis working on your Engine Yard Cloud application.

Install the Redis gem

First, you need to bundle the Redis gem into your application.

To add Redis to your application

  1. Add the Redis gem to your gemfile.
    gem ‘redis’
  2. Install the Redis gem using bundler from your development machine.
    bundle install
  3. Deploy your application.

Update the Redis version

New (or newly upgraded) environments have the Engine Yard recommended version of Redis installed. (See Engine Yard Technology Stack.) If your application is running in an older environment, you might have to restart the Redis server to apply the changes.

To find out your Redis version

  1. Via SSH, connect to the application and database instance (for single server environment), or the database instance (for a clustered environment), or the utility server (if you have installed Redis there).

  2. Type:

     redis-cli
  3. At the Redis prompt, type:

    redis 127.0.0.1:6379> info

    The response shows the version number on the first line:

     redis_version:2.2.10 
  4. If your version is older that the recommended version (see Engine Yard Technology Stack), follow the procedure below to update the Redis version.

To update Redis

  1. Via SSH, connect to the application and database instance (for single server environment), or the database instance (for a clustered environment), or the utility server (if you have installed Redis there).

  2. Type:

    sudo monit restart redis

Install Redis on a utility instance

If you plan to use Redis in-depth, we recommend that you install Redis on a utility instance. This way, Redis doesn’t share resources with your application instance. To do this, you need a custom Chef recipe. For more information about custom Chef recipes, see Custom Chef recipes.

Note: You should only have one Redis install per environment. Engine Yard does not recommend installing Redis on your application instances because it can cause complications. For example, if you have more than one app instances, installing Redis on those instances can result in multiple Redis versions on your app servers. If you install it only on your application master, it will likely get overloaded.

Here is a procedure for adding Redis to a utility instance named “redis”. You’ll need to adjust this procedure for your specific environment.

To install Redis on a utility instance

  1. Download the ey-cloud-recipes to your local computer.

    $ git clone https://github.com/engineyard/ey-cloud-recipes.git 
  2. Uncomment require_recipe "redis" from the main cookbook (main/recipes/default.rb).

  3. Add a utility instance named “redis” to your application.

  4. Upload and apply the recipes to your environment:

    $ ey recipes upload -e <environment_name> 
    $ ey recipes apply -e <environment_name>

To connect to Redis on the utility instance from your Rails application

Here is a link to a Gist that will write out a redis.yml configuration file. You can then connect to Redis in an initializer or environment file using the following:

# Load the redis.yml configuration file 
redis_config = YAML.load_file(Rails.root + 'config/redis.yml')[Rails.env]

# Connect to Redis using the redis_config host and port
if redis_config
$redis = Redis.new(host: redis_config['host'], port: redis_config['port'])
end

Things to do with Redis

You can use Redis:

More information

For more information about...See...
Resque and Redis                                                                                    Configure and deploy Resque.                                                                        
SSHing into an instance Connect to your instance via SSH.
Using Redis with Unicorn Customize Unicorn.

If you have feedback or questions about this page, add a comment below. If you need help, submit a ticket with Engine Yard Support.

 

Comments

User photo
Petteri Räty
experq

The documented command to restart Redis did not work for me when upgrading. The command that does the trick is:

monit restart redis

/etc/init.d/redis does not work because the Engine Yard stack controls redis through monit. When running the init script baselayout is not aware that redis is already running and just tries to start the daemon. This fails because redis is already running and in control of port 6379:

# tail  /var/log/redis/redis.log                                                                                                                                                                     
[23616] 06 May 23:27:39 # Opening port 6379: bind: Address already in use

May 06, 2012 01:30 PM
User photo
Petteri Räty
experq

If you are running your application with unicorn you should customize your unicorn configuration to reconnect the clients after forking. Instructions for setting up a custom configuration can be found here:

https://support.cloud.engineyard.com/entries/20996656-customize-uni...

If you don't do this you might stumble upon an error like:

Redis::ProtocolError: Got '2' as initial reply byte. If you're running in a multi-threaded environment, make sure you pass the :thread_safe option when initializing the connection. If you're in a forking environment, such as Unicorn, you need to connect to Redis after forking.

May 06, 2012 01:36 PM
User photo
John Yerhot
Engine Yard Inc.

Hi Petteri,

Great additions, I'll make sure our documentation gets updated with these.

Best,

John

May 11, 2012 12:27 PM
User photo
Keri Meredith
Engine Yard Inc.

Hi Petteri, thanks again for your feedback on our documentation. This page has been updated. kjm

May 21, 2012 07:14 PM
User photo
Petteri Räty
experq

Keri: There is a problem with the link at the bottom for: "Using Redis with Unicorn Customize Unicorn." The problem is that redis information has not been added to the Customize Unicorn page yet.

Petteri

May 22, 2012 12:02 AM
User photo
Keri Meredith
Engine Yard Inc.

Hi Petteri, we are working through these docs - stay tuned! thanks, kjm

May 23, 2012 02:04 PM
User photo
Krasimir Angelov
MeetPips

Hi,

Where can we see the docs related to using Redis with Unicorn on EY? This info is still missing from https://support.cloud.engineyard.com/entries/20996656-customize-uni....

July 17, 2012 03:43 AM
User photo
Jacob Burkhart
Engine Yard Inc.

It appears that EY automatically installs and runs a redis instance on the DB master.  It's not replicated, monitored, or backed-up, but it will work if you want something simple. (like for caching)

Here's the code snippet I use to talk to redis:

if dbhost = ActiveRecord::Base.connection.instance_variable_get(:@config)[:host]
  REDIS = Redis.connect(:url => "redis://#{dbhost}")
else
  REDIS = Redis.connect(:url => "redis://127.0.0.1")
end

August 20, 2012 04:46 PM