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