2013-02-05 14:16:51 -05:00
#
# A wrapper around redis that namespaces keys with the current site id
#
class DiscourseRedis
2013-02-25 19:42:20 +03:00
2013-03-24 23:19:59 -07:00
def self . raw_connection ( config = nil )
config || = self . config
redis_opts = { host : config [ 'host' ] , port : config [ 'port' ] , db : config [ 'db' ] }
redis_opts [ :password ] = config [ 'password' ] if config [ 'password' ]
Redis . new ( redis_opts )
end
def self . config
2013-04-11 16:24:08 +10:00
@config || = YAML . load ( ERB . new ( File . new ( " #{ Rails . root } /config/redis.yml " ) . read ) . result ) [ Rails . env ]
end
def self . url ( config = nil )
config || = self . config
" redis:// #{ ( ':' + config [ 'password' ] + '@' ) if config [ 'password' ] } #{ config [ 'host' ] } : #{ config [ 'port' ] } / #{ config [ 'db' ] } "
2013-03-24 23:19:59 -07:00
end
2013-02-05 14:16:51 -05:00
def initialize
2013-03-24 23:19:59 -07:00
@config = DiscourseRedis . config
@redis = DiscourseRedis . raw_connection ( @config )
2013-02-05 14:16:51 -05:00
end
2013-04-11 16:24:08 +10:00
def url
self . class . url ( @config )
end
2013-02-05 14:16:51 -05:00
# prefix the key with the namespace
def method_missing ( meth , * args , & block )
if @redis . respond_to? ( meth )
2013-02-25 19:42:20 +03:00
@redis . send ( meth , * args , & block )
2013-02-05 14:16:51 -05:00
else
super
end
end
# Proxy key methods through, but prefix the keys with the namespace
2013-05-06 09:51:09 +10:00
[ :append , :blpop , :brpop , :brpoplpush , :decr , :decrby , :del , :exists , :expire , :expireat , :get , :getbit , :getrange , :getset ,
:hdel , :hexists , :hget , :hgetall , :hincrby , :hincrbyfloat , :hkeys , :hlen , :hmget , :hmset , :hset , :hsetnx , :hvals , :incr ,
:incrby , :incrbyfloat , :lindex , :linsert , :llen , :lpop , :lpush , :lpushx , :lrange , :lrem , :lset , :ltrim , :mget , :move , :mset ,
:msetnx , :persist , :pexpire , :pexpireat , :psetex , :pttl , :rename , :renamenx , :rpop , :rpoplpush , :rpush , :rpushx , :sadd , :scard ,
:sdiff , :set , :setbit , :setex , :setnx , :setrange , :sinter , :sismember , :smembers , :sort , :spop , :srandmember , :srem , :strlen ,
:sunion , :ttl , :type , :watch , :zadd , :zcard , :zcount , :zincrby , :zrange , :zrangebyscore , :zrank , :zrem , :zremrangebyrank ,
:zremrangebyscore , :zrevrange , :zrevrangebyscore , :zrevrank , :zrangebyscore ] . each do | m |
2013-02-10 00:02:29 +01:00
define_method m do | * args |
args [ 0 ] = " #{ DiscourseRedis . namespace } : #{ args [ 0 ] } "
2013-05-05 13:34:54 +02:00
@redis . send ( m , * args )
2013-02-10 00:02:29 +01:00
end
2013-02-05 14:16:51 -05:00
end
def self . namespace
RailsMultisite :: ConnectionManagement . current_db
end
2013-03-11 05:33:20 -07:00
def self . new_redis_store
2013-03-10 12:51:49 +00:00
redis_config = YAML . load ( ERB . new ( File . new ( " #{ Rails . root } /config/redis.yml " ) . read ) . result ) [ Rails . env ]
2013-05-15 10:07:16 -04:00
unless redis_config
puts '' , " Redis config for environment ' #{ Rails . env } ' was not found in #{ Rails . root } /config/redis.yml. "
puts " Did you forget to do RAILS_ENV=production? "
puts " Check your redis.yml and make sure it has configuration for the environment you're trying to use. " , ''
raise 'Redis config not found'
end
2013-03-10 12:51:49 +00:00
redis_store = ActiveSupport :: Cache :: RedisStore . new " redis:// #{ ( ':' + redis_config [ 'password' ] + '@' ) if redis_config [ 'password' ] } #{ redis_config [ 'host' ] } : #{ redis_config [ 'port' ] } / #{ redis_config [ 'cache_db' ] } "
2013-03-11 05:33:20 -07:00
redis_store . options [ :namespace ] = - > { DiscourseRedis . namespace }
redis_store
end
2013-02-05 14:16:51 -05:00
end