discourse/lib/discourse_redis.rb
Sam 850b042cab introduce rack:cache as a default, so users don't need to configure apache or nginx
under rack cache we are able to serve 620reqs a second per thin (on my machine) before it 12 (on my machine)

reorganised so mini profilers can be cleanly disabled from config file

added caching for categories index

move production.rb to production.sample.rb
2013-04-11 16:24:21 +10:00

65 lines
2.4 KiB
Ruby

#
# A wrapper around redis that namespaces keys with the current site id
#
class DiscourseRedis
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']}"
end
def initialize
@config = DiscourseRedis.config
@redis = DiscourseRedis.raw_connection(@config)
end
def url
self.class.url(@config)
end
# prefix the key with the namespace
def method_missing(meth, *args, &block)
if @redis.respond_to?(meth)
@redis.send(meth, *args, &block)
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(__method__, *args)
end
end
def self.namespace
RailsMultisite::ConnectionManagement.current_db
end
def self.new_redis_store
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
end