class Rack::MiniProfiler::RedisStore

Constants

EXPIRES_IN_SECONDS

Attributes

prefix[R]

Public Class Methods

new(args = nil) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 9
def initialize(args = nil)
  @args               = args || {}
  @prefix             = @args.delete(:prefix)     || 'MPRedisStore'
  @redis_connection   = @args.delete(:connection)
  @expires_in_seconds = @args.delete(:expires_in) || EXPIRES_IN_SECONDS
end

Public Instance Methods

allowed_tokens() click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 80
def allowed_tokens
  key1, key1_old, key2 = redis.mget("#{@prefix}-key1", "#{@prefix}-key1_old", "#{@prefix}-key2")

  if key1 && (key1.length == 32)
    return [key1, key2].compact
  end

  timeout = Rack::MiniProfiler::AbstractStore::MAX_TOKEN_AGE

  # TODO  this could be moved to lua to correct a concurrency flaw
  # it is not critical cause worse case some requests will miss profiling info

  # no key so go ahead and set it
  key1 = SecureRandom.hex

  if key1_old && (key1_old.length == 32)
    key2 = key1_old
    redis.setex "#{@prefix}-key2", timeout, key2
  else
    key2 = nil
  end

  redis.setex "#{@prefix}-key1", timeout, key1
  redis.setex "#{@prefix}-key1_old", timeout*2, key1

  [key1, key2].compact
end
diagnostics(user) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 64
      def diagnostics(user)
"Redis prefix: #{@prefix}
Redis location: #{redis.client.host}:#{redis.client.port} db: #{redis.client.db}
unviewed_ids: #{get_unviewed_ids(user)}
"
      end
flush_tokens() click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 71
def flush_tokens
  redis.del("#{@prefix}-key1", "#{@prefix}-key1_old", "#{@prefix}-key2")
end
get_unviewed_ids(user) click to toggle source

Remove expired ids from the unviewed sorted set and return the remaining ids

# File lib/mini_profiler/storage/redis_store.rb, line 58
def get_unviewed_ids(user)
  key = user_key(user)
  redis.zremrangebyscore(key, '-inf', Time.now.to_i)
  redis.zrevrangebyscore(key, '+inf', '-inf')
end
load(id) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 20
def load(id)
  key = prefixed_id(id)
  raw = redis.get key
  begin
    Marshal::load(raw) if raw
  rescue
    # bad format, junk old data
    redis.del key
    nil
  end
end
save(page_struct) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 16
def save(page_struct)
  redis.setex prefixed_id(page_struct[:id]), @expires_in_seconds, Marshal::dump(page_struct)
end
set_all_unviewed(user, ids) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 41
def set_all_unviewed(user, ids)
  key = user_key(user)
  redis.del(key)
  ids.each do |id|
    if redis.exists(prefixed_id(id))
      expire_at = Time.now.to_i + redis.ttl(prefixed_id(id))
      redis.zadd(key, expire_at, id)
    end
  end
  redis.expire(key, @expires_in_seconds)
end
set_unviewed(user, id) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 32
def set_unviewed(user, id)
  key = user_key(user)
  if redis.exists(prefixed_id(id))
    expire_at = Time.now.to_i + redis.ttl(prefixed_id(id))
    redis.zadd(key, expire_at, id)
  end
  redis.expire(key, @expires_in_seconds)
end
set_viewed(user, id) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 53
def set_viewed(user, id)
  redis.zrem(user_key(user), id)
end
simulate_expire() click to toggle source

Only used for testing

# File lib/mini_profiler/storage/redis_store.rb, line 76
def simulate_expire
  redis.del("#{@prefix}-key1")
end

Private Instance Methods

prefixed_id(id) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 114
def prefixed_id(id)
  "#{@prefix}#{id}"
end
redis() click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 118
def redis
  @redis_connection ||= begin
    require 'redis' unless defined? Redis
    Redis.new(@args)
  end
end
user_key(user) click to toggle source
# File lib/mini_profiler/storage/redis_store.rb, line 110
def user_key(user)
  "#{@prefix}-#{user}-v1"
end