h1ghlevelb1ts

Using redis as a cache with Ruby

For one sinatra based web site I am messing with I needed a cache for calls to third party APIs. I had used redis before together with resque at a client gig so it was a natural choice for this task. Essentially I needed to use URLs as keys and the returned content for that URL as the value.

Installing redis is easy on arch:

pacman -S redis 

It hooks in nicely with systemctl so you can

systemctl start redis
systemctl enable redis 

to have it up and running after reboots.

For integrating with Ruby there is a nice gem called redis. Install it with:

gem install redis

or put it in your Gemfile for use with bundler.

Now we are ready to start using redis. My use case is the simplest possible with strings for both keys and values. To start interacting with redis you need a client instance:

redis = Redis.new host: '127.0.0.1'

This creates a client with all the defaults trying to connect with redis on the default port 6379. On my server I have a restrictive firewall running so I had to specify talking to an IP address rather than the default localhost. It is also possible to start redis listening to a socket instead of a port. This may be a bit faster.

Now we can put some stuff into the database:

redis.set 'some_random_key', 'value'
redis.expire 'some_random_key', 60 * 60 * 24

If I want to save the value forever only the first line is needed. But since this is a cache I had to add the second line to get a 24 hour expiry time on the item.

Now the key will be available for 24 hours and the be removed. To retrieve the value is just as easy:

redis.get 'some_random_key'

I coded this up on the commute to work one day and installed it on the server the next. Really easy and useful. I certainly will consider redis as a database candidate for real work in the future. Using it as a cache is nice but it seems capable of being you main persistance store if you are into NoSQL stuff.

Also - it is really fast.