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:
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.