initial work to being able to use per-model redis

configurations
This commit is contained in:
2010-11-28 10:10:58 +00:00
parent 5338676a5f
commit dc162e0c89
7 changed files with 164 additions and 82 deletions

View File

@@ -10,6 +10,7 @@ require 'json'
require 'digest/sha1'
require 'redistat/collection'
require 'redistat/connection'
require 'redistat/database'
require 'redistat/date'
require 'redistat/event'
@@ -34,51 +35,28 @@ module Redistat
KEY_EVENT_IDS = ".event_ids"
class InvalidOptions < ArgumentError; end
# Provides access to the Redis database. This is shared accross all models and instances.
def redis
threaded[:redis] ||= connection(*options)
end
def redis=(connection)
threaded[:redis] = connection
end
def threaded
Thread.current[:redistat] ||= {}
end
# Connect to a redis database.
#
# @param options [Hash] options to create a message with.
# @option options [#to_s] :host ('127.0.0.1') Host of the redis database.
# @option options [#to_s] :port (6379) Port number.
# @option options [#to_s] :db (0) Database number.
# @option options [#to_s] :timeout (0) Database timeout in seconds.
# @example Connect to a database in port 6380.
# Redistat.connect(:port => 6380)
def connect(*options)
self.redis = nil
@options = options
end
# Return a connection to Redis.
#
# This is a wapper around Redis.new(options)
def connection(*options)
Redis.new(*options)
end
def options
@options = [] unless defined? @options
@options
end
# Clear the database.
def flush
redis.flushdb
end
class RedisServerIsTooOld < Exception; end
module_function :connect, :connection, :flush, :redis, :redis=, :options, :threaded
class << self
def connection(ref = nil)
Connection.get(ref)
end
alias :redis :connection
def connection=(connection)
Connection.add(connection)
end
alias :redis= :connection=
def connect(options)
Connection.create(options)
end
def flush
puts "WARNING: Redistat.flush is deprecated. Use Redistat.redis.flush instead."
connection.flushdb
end
end
end

View File

@@ -0,0 +1,67 @@
module Redistat
module Connection
REQUIRED_SERVER_VERSION = "1.3.10"
class << self
def get(ref = nil)
ref ||= :default
connections[references[ref]] || create
end
def add(conn, ref = nil)
ref ||= :default
check_redis_version(conn)
references[ref] = conn.client.id
connections[conn.client.id] = conn
end
def create(options = {})
ref = options.delete(:ref) || :default
options.reverse_merge!(default_options)
conn = (connections[connection_id(options)] ||= connection(options))
references[ref] = conn.client.id
conn
end
def connections
threaded[:connections] ||= {}
end
def references
threaded[:references] ||= {}
end
def threaded
Thread.current[:redistat] ||= {}
end
private
def check_redis_version(conn)
raise RedisServerIsTooOld if conn.info["redis_version"] < REQUIRED_SERVER_VERSION
conn
end
def connection(options)
check_redis_version(Redis.new(options))
end
def connection_id(options = {})
options.reverse_merge!(default_options)
"redis://#{options[:host]}:#{options[:port]}/#{options[:db]}"
end
def default_options
{
:host => '127.0.0.1',
:port => 6379,
:db => 0,
:timeout => 5
}
end
end
end
end

View File

@@ -4,7 +4,7 @@ module Redistat
base.extend(Database)
end
def db
Redistat.redis
Redistat.connection
end
end
end