Class: Profiler::Storage::RedisStore

Inherits:
BaseStore
  • Object
show all
Defined in:
lib/profiler/storage/redis_store.rb

Constant Summary collapse

DEFAULT_TTL =

24 hours

24 * 60 * 60

Instance Method Summary collapse

Methods inherited from BaseStore

#exists?

Constructor Details

#initialize(options = {}) ⇒ RedisStore

Returns a new instance of RedisStore.



13
14
15
16
17
# File 'lib/profiler/storage/redis_store.rb', line 13

def initialize(options = {})
  @redis = options[:redis] || build_redis_client(options)
  @ttl = options[:ttl] || DEFAULT_TTL
  @key_prefix = options[:key_prefix] || "profiler"
end

Instance Method Details

#cleanup(older_than: 24 * 60 * 60) ⇒ Object



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

def cleanup(older_than: 24 * 60 * 60)
  cutoff_time = Time.now.to_f - older_than
  @redis.zremrangebyscore(list_key, "-inf", cutoff_time)
end

#clear(type: nil) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/profiler/storage/redis_store.rb', line 66

def clear(type: nil)
  tokens = @redis.zrange(list_key, 0, -1)
  tokens.each do |token|
    if type.nil?
      @redis.del(profile_key(token))
      @redis.zrem(list_key, token)
    else
      profile = load(token)
      if profile&.profile_type == type.to_s
        @redis.del(profile_key(token))
        @redis.zrem(list_key, token)
      end
    end
  end
end

#delete(token) ⇒ Object



61
62
63
64
# File 'lib/profiler/storage/redis_store.rb', line 61

def delete(token)
  @redis.del(profile_key(token))
  @redis.zrem(list_key, token)
end

#find_by_parent(parent_token) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/profiler/storage/redis_store.rb', line 50

def find_by_parent(parent_token)
  # Get all tokens from the sorted set
  tokens = @redis.zrange(list_key, 0, -1)

  # Load each profile and filter by parent_token
  tokens.map { |token| load(token) }
        .compact
        .select { |profile| profile.parent_token == parent_token }
        .sort_by { |profile| profile.started_at }
end

#list(limit: 50, offset: 0) ⇒ Object



40
41
42
43
# File 'lib/profiler/storage/redis_store.rb', line 40

def list(limit: 50, offset: 0)
  tokens = @redis.zrevrange(list_key, offset, offset + limit - 1)
  tokens.map { |token| load(token) }.compact
end

#load(token) ⇒ Object



29
30
31
32
33
34
35
36
37
38
# File 'lib/profiler/storage/redis_store.rb', line 29

def load(token)
  key = profile_key(token)
  json_data = @redis.get(key)
  return nil unless json_data

  Models::Profile.from_json(json_data)
rescue => e
  warn "Failed to load profile #{token}: #{e.message}"
  nil
end

#save(token, profile) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/profiler/storage/redis_store.rb', line 19

def save(token, profile)
  key = profile_key(token)
  @redis.setex(key, @ttl, profile.to_json)

  # Add to sorted set for listing
  @redis.zadd(list_key, profile.started_at.to_f, token)

  token
end