Sha256: cedb504f7468fbc9c1054a8a981719a43edde529de054af98c740b1be3ee445e

Contents?: true

Size: 1003 Bytes

Versions: 1

Compression:

Stored size: 1003 Bytes

Contents

# Roulette.config([Redis.new(..), Redis.new(...)])
#
# r = Roulette.new([Redis.new(..), Redis.new(...)])
#
#
# Roulette.shard(:whatevs).sadd("key", "value")
# roulette = Roulette.new(REDIS, REDIS2, REDIS3, ...)
# roulette.set("key", "value")
# roulette.get("key")
# >> "value"

require 'digest/sha1'

class Roulette
  attr_accessor :stores

  def initialize(*stores)
    self.stores = stores
  end

  def method_missing(method_name, *args, &blk)
    Transaction.new(@stores, *args).fire(method_name)
  end

  class Transaction
    attr_accessor :key, :args, :stores

    def initialize(stores, *args)
      self.stores = stores
      self.args = *args
      extract_args
    end

    def extract_args
      self.key = args.first.to_s
    end

    def fire(method)
      select_store.send method.to_sym, *args
    end

    private
    def select_store
      val = Digest::SHA1.hexdigest(self.key).unpack('Q').join.to_i
      store_index = val % stores.count
      @stores[store_index]
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
roulette-0.0.1 lib/roulette.rb