discourse/lib/discourse_redis.rb

66 lines
2.4 KiB
Ruby
Raw Normal View History

2013-02-06 03:16:51 +08:00
#
# A wrapper around redis that namespaces keys with the current site id
#
class DiscourseRedis
2013-02-26 00:42:20 +08:00
2013-03-25 14:19:59 +08: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
@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-25 14:19:59 +08:00
end
2013-02-06 03:16:51 +08:00
def initialize
2013-03-25 14:19:59 +08:00
@config = DiscourseRedis.config
@redis = DiscourseRedis.raw_connection(@config)
2013-02-06 03:16:51 +08:00
end
def url
self.class.url(@config)
end
2013-02-06 03:16:51 +08:00
# prefix the key with the namespace
def method_missing(meth, *args, &block)
if @redis.respond_to?(meth)
2013-02-26 00:42:20 +08:00
@redis.send(meth, *args, &block)
2013-02-06 03:16:51 +08:00
else
super
end
end
# Proxy key methods through, but prefix the keys with the namespace
%w(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|
define_method m do |*args|
args[0] = "#{DiscourseRedis.namespace}:#{args[0]}"
@redis.send(m, *args)
end
2013-02-06 03:16:51 +08:00
end
def self.namespace
RailsMultisite::ConnectionManagement.current_db
end
def self.new_redis_store
2013-03-10 20:51:49 +08:00
redis_config = YAML.load(ERB.new(File.new("#{Rails.root}/config/redis.yml").read).result)[Rails.env]
redis_store = ActiveSupport::Cache::RedisStore.new "redis://#{(':' + redis_config['password'] + '@') if redis_config['password']}#{redis_config['host']}:#{redis_config['port']}/#{redis_config['cache_db']}"
redis_store.options[:namespace] = -> { DiscourseRedis.namespace }
redis_store
end
2013-02-06 03:16:51 +08:00
end