Class: Rack::MiniProfiler::RedisStore

Inherits:
AbstractStore show all
Defined in:
lib/mini_profiler/storage/redis_store.rb

Constant Summary collapse

EXPIRES_IN_SECONDS =
60 * 60 * 24

Constants inherited from AbstractStore

AbstractStore::MAX_TOKEN_AGE

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = nil) ⇒ RedisStore

Returns a new instance of RedisStore.



9
10
11
12
13
14
# 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

Instance Attribute Details

#prefixObject (readonly)

Returns the value of attribute prefix.



5
6
7
# File 'lib/mini_profiler/storage/redis_store.rb', line 5

def prefix
  @prefix
end

Instance Method Details

#allowed_tokensObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/mini_profiler/storage/redis_store.rb', line 69

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) ⇒ Object



53
54
55
56
57
58
# File 'lib/mini_profiler/storage/redis_store.rb', line 53

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_tokensObject



60
61
62
# File 'lib/mini_profiler/storage/redis_store.rb', line 60

def flush_tokens
  redis.del("#{@prefix}-key1", "#{@prefix}-key1_old", "#{@prefix}-key2")
end

#get_unviewed_ids(user) ⇒ Object



49
50
51
# File 'lib/mini_profiler/storage/redis_store.rb', line 49

def get_unviewed_ids(user)
  redis.smembers "#{@prefix}-#{user}-v"
end

#load(id) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/mini_profiler/storage/redis_store.rb', line 20

def load(id)
  key = "#{@prefix}#{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) ⇒ Object



16
17
18
# File 'lib/mini_profiler/storage/redis_store.rb', line 16

def save(page_struct)
  redis.setex "#{@prefix}#{page_struct[:id]}", @expires_in_seconds, Marshal::dump(page_struct)
end

#set_all_unviewed(user, ids) ⇒ Object



38
39
40
41
42
43
# File 'lib/mini_profiler/storage/redis_store.rb', line 38

def set_all_unviewed(user, ids)
  key = "#{@prefix}-#{user}-v"
  redis.del key
  ids.each { |id| redis.sadd(key, id) }
  redis.expire key, @expires_in_seconds
end

#set_unviewed(user, id) ⇒ Object



32
33
34
35
36
# File 'lib/mini_profiler/storage/redis_store.rb', line 32

def set_unviewed(user, id)
  key = "#{@prefix}-#{user}-v"
  redis.sadd key, id
  redis.expire key, @expires_in_seconds
end

#set_viewed(user, id) ⇒ Object



45
46
47
# File 'lib/mini_profiler/storage/redis_store.rb', line 45

def set_viewed(user, id)
  redis.srem "#{@prefix}-#{user}-v", id
end

#simulate_expireObject

Only used for testing



65
66
67
# File 'lib/mini_profiler/storage/redis_store.rb', line 65

def simulate_expire
  redis.del("#{@prefix}-key1")
end