Class: Magick::Adapters::Redis

Inherits:
Base
  • Object
show all
Defined in:
lib/magick/adapters/redis.rb

Instance Method Summary collapse

Constructor Details

#initialize(redis_client = nil) ⇒ Redis

Returns a new instance of Redis.



8
9
10
11
12
13
14
# File 'lib/magick/adapters/redis.rb', line 8

def initialize(redis_client = nil)
  @redis = redis_client || default_redis_client
  @namespace = 'magick:features'
  raise AdapterError, 'Redis client is required' unless @redis
rescue StandardError => e
  raise AdapterError, "Failed to initialize Redis adapter: #{e.message}"
end

Instance Method Details

#all_featuresObject



41
42
43
44
45
46
# File 'lib/magick/adapters/redis.rb', line 41

def all_features
  keys = scan_keys
  keys.map { |key| key.sub("#{namespace}:", '') }
rescue StandardError => e
  raise AdapterError, "Failed to get all features from Redis: #{e.message}"
end

#clientObject

Public accessor for the underlying Redis client



98
99
100
# File 'lib/magick/adapters/redis.rb', line 98

def client
  @redis
end

#delete(feature_name) ⇒ Object



29
30
31
32
33
# File 'lib/magick/adapters/redis.rb', line 29

def delete(feature_name)
  redis.del(key_for(feature_name))
rescue StandardError => e
  raise AdapterError, "Failed to delete from Redis: #{e.message}"
end

#exists?(feature_name) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
39
# File 'lib/magick/adapters/redis.rb', line 35

def exists?(feature_name)
  redis.exists?(key_for(feature_name))
rescue StandardError => e
  raise AdapterError, "Failed to check existence in Redis: #{e.message}"
end

#get(feature_name, key) ⇒ Object



16
17
18
19
20
21
# File 'lib/magick/adapters/redis.rb', line 16

def get(feature_name, key)
  value = redis.hget(key_for(feature_name), key.to_s)
  deserialize_value(value)
rescue StandardError => e
  raise AdapterError, "Failed to get from Redis: #{e.message}"
end

#get_all_data(feature_name) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# File 'lib/magick/adapters/redis.rb', line 48

def get_all_data(feature_name)
  raw = redis.hgetall(key_for(feature_name))
  return {} if raw.nil? || raw.empty?

  raw.each_with_object({}) do |(k, v), result|
    result[k.to_s] = deserialize_value(v)
  end
rescue StandardError => e
  raise AdapterError, "Failed to get all data from Redis: #{e.message}"
end

#load_all_features_dataObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/magick/adapters/redis.rb', line 59

def load_all_features_data
  keys = scan_keys
  return {} if keys.empty?

  # Pipeline all HGETALL calls to avoid N+1 round-trips
  raw_results = redis.pipelined do |pipeline|
    keys.each { |key| pipeline.hgetall(key) }
  end

  result = {}
  keys.each_with_index do |key, idx|
    feature_name = key.sub("#{namespace}:", '')
    raw = raw_results[idx]
    next if raw.nil? || raw.empty?

    feature_data = {}
    raw.each do |k, v|
      feature_data[k.to_s] = deserialize_value(v)
    end
    result[feature_name] = feature_data
  end
  result
rescue StandardError => e
  raise AdapterError, "Failed to load all features from Redis: #{e.message}"
end

#set(feature_name, key, value) ⇒ Object



23
24
25
26
27
# File 'lib/magick/adapters/redis.rb', line 23

def set(feature_name, key, value)
  redis.hset(key_for(feature_name), key.to_s, serialize_value(value))
rescue StandardError => e
  raise AdapterError, "Failed to set in Redis: #{e.message}"
end

#set_all_data(feature_name, data_hash) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/magick/adapters/redis.rb', line 85

def set_all_data(feature_name, data_hash)
  return if data_hash.nil? || data_hash.empty?

  serialized = {}
  data_hash.each do |key, value|
    serialized[key.to_s] = serialize_value(value)
  end
  redis.mapped_hmset(key_for(feature_name), serialized)
rescue StandardError => e
  raise AdapterError, "Failed to set all data in Redis: #{e.message}"
end