2013-02-05 14:16:51 -05:00
#
# A wrapper around redis that namespaces keys with the current site id
#
2014-01-06 16:50:04 +11:00
require_dependency 'cache'
2013-02-05 14:16:51 -05:00
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-12-20 16:34:34 -05:00
def without_namespace
# Only use this if you want to store and fetch data that's shared between sites
@redis
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
2014-01-06 16:50:04 +11:00
[ :append , :blpop , :brpop , :brpoplpush , :decr , :decrby , :exists , :expire , :expireat , :get , :getbit , :getrange , :getset ,
2013-05-06 09:51:09 +10:00
:hdel , :hexists , :hget , :hgetall , :hincrby , :hincrbyfloat , :hkeys , :hlen , :hmget , :hmset , :hset , :hsetnx , :hvals , :incr ,
2013-12-31 15:52:16 -05:00
:incrby , :incrbyfloat , :lindex , :linsert , :llen , :lpop , :lpush , :lpushx , :lrange , :lrem , :lset , :ltrim ,
:mapped_hmset , :mapped_hmget , :mapped_mget , :mapped_mset , :mapped_msetnx , :mget , :move , :mset ,
2013-05-06 09:51:09 +10:00
: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
2014-01-06 16:50:04 +11:00
def del ( k )
k = " #{ DiscourseRedis . namespace } : #{ k } "
@redis . del k
end
def keys
len = DiscourseRedis . namespace . length + 1
@redis . keys ( " #{ DiscourseRedis . namespace } :* " ) . map {
| k | k [ len .. - 1 ]
}
end
def flushdb
keys . each { | k | del ( k ) }
end
def reconnect
@redis . client . reconnect
end
2013-02-05 14:16:51 -05:00
def self . namespace
RailsMultisite :: ConnectionManagement . current_db
end
2013-03-11 05:33:20 -07:00
def self . new_redis_store
2014-01-06 16:50:04 +11:00
Cache . new
2013-03-11 05:33:20 -07:00
end
2013-02-05 14:16:51 -05:00
end