Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Ruby implementation of Redis client and server protocol in EventMachine with Synchrony support.
branch: master

This branch is 2 commits behind AE9RB:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
bin
lib
src
test
tests
.gitignore
Gemfile
LICENSE
README.md
ruby-redis.gemspec

README.md

This project was started because I needed an authenticating and routable proxy for Redis. The main feature is a high performance, eventable, pure Ruby implementation of the complete Redis wire protocol using the same interface as hiredis/reader.

Ruby Gem

# Best with Ruby 1.9.2; works with 1.8.7, JRuby, and Rubinius.
gem install ruby-redis
# Runs a server that looks and feels like the C redis-server
ruby-redis

Client example

require 'redis'
EventMachine.run {
  redis = EventMachine.connect '127.0.0.1', 6379, Redis::Client
  # Subscribe and publish messages will call here
  redis.on_pubsub do |message|
    # case message[0]
    # when 'psubscribe' ...
  end
  # All commands implemented uniformly with method_missing
  # Returns instance of Redis::Command < EventMachine::Deferrable 
  # Pipelining is implicit
  redis.set :pi, 3.14159
  redis.get('pi') do |result|
    p result
  end
  redis.blpop('mylist', 1).callback do |result|
    p result
    EM.stop
  end.errback do |e|
    EM.stop
    raise e
  end
}

Using hiredis/reader (only affects clients)

# require it before you connect
require 'hiredis/reader'

Fibers example (compatible with em-synchrony)

require 'redis/synchrony'
Redis.synchrony {
  # Be sure to pipeline commands when you can
  redis = EventMachine.connect '127.0.0.1', 6379, Redis::Client
  # synchronized requests will return result or raise exception
  sync = redis.synchrony
  # repeat transaction until success
  reply = check = nil
  until reply
    redis.watch 'mykey'
    x = sync.get('mykey').to_i
    redis.multi
    redis.set 'mykey', x + 1
    redis.badcmd
    redis.get('mykey') {|result| check=result}
    reply = sync.exec
  end
  redis.close
  EM.stop
  p reply, check # ["OK", #<RuntimeError>, "4"], "4"
}

Ruby to Redis type conversions

      String === Status reply
RuntimeError === Error reply
      String === Bulk reply
     Integer === Integer reply
       Array === Multi-bulk reply
        Hash === Multi-bulk reply to hgetall
    NilClass === Nil element or nil multi-bulk
   TrueClass === :1
  FalseClass === :0
Something went wrong with that request. Please try again.