Skip to content

Commit b046250

Browse files
authored
Merge pull request #751 from splitrb/reduce-redis-roundtrips
Reduce redis roundtrips when loading Experiments
2 parents 9477336 + ae2812d commit b046250

2 files changed

Lines changed: 36 additions & 23 deletions

File tree

lib/split/experiment.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ class Experiment
1818

1919
def self.find(name)
2020
Split.cache(:experiments, name) do
21-
return unless Split.redis.exists?(name)
22-
Experiment.new(name).tap { |exp| exp.load_from_redis }
21+
experiment = Experiment.new(name)
22+
experiment.load_from_redis
23+
experiment unless experiment.alternatives.empty?
2324
end
2425
end
2526

lib/split/experiment_storage.rb

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,22 @@ def exists?
8080
redis.exists?(@name)
8181
end
8282

83-
def load_alternatives
84-
alternatives = redis.lrange(@name, 0, -1)
85-
alternatives.map do |alt|
86-
alt = begin
87-
JSON.parse(alt)
88-
rescue
89-
alt
90-
end
91-
Split::Alternative.new(alt, @name)
83+
def load!
84+
raw_config, raw_alternatives, raw_metadata, raw_goals = redis.pipelined do |pipe|
85+
pipe.hgetall(experiment_config_key)
86+
pipe.lrange(@name, 0, -1)
87+
pipe.get(metadata_key)
88+
pipe.lrange(goals_key, 0, -1)
9289
end
93-
end
94-
95-
def load_metadata
96-
meta = redis.get(metadata_key)
97-
JSON.parse(meta) unless meta.nil?
98-
end
99-
100-
def load_goals
101-
Split::GoalsCollection.new(@name).load_from_redis
102-
end
90+
config = raw_config.transform_keys(&:to_sym)
10391

104-
def load_experiment
105-
redis.hgetall(experiment_config_key).transform_keys(&:to_sym)
92+
{
93+
resettable: config[:resettable],
94+
algorithm: config[:algorithm],
95+
alternatives: build_alternatives(raw_alternatives),
96+
goals: raw_goals,
97+
metadata: parse_metadata(raw_metadata)
98+
}
10699
end
107100

108101
def experiment_config_key
@@ -113,10 +106,29 @@ def metadata_key
113106
"#{name}:metadata"
114107
end
115108

109+
def goals_key
110+
"#{name}:goals"
111+
end
112+
116113
private
117114
def redis
118115
Split.redis
119116
end
117+
118+
def build_alternatives(raw_alternatives)
119+
raw_alternatives.map do |alt|
120+
alt = begin
121+
JSON.parse(alt)
122+
rescue
123+
alt
124+
end
125+
Split::Alternative.new(alt, @name)
126+
end
127+
end
128+
129+
def parse_metadata(raw_metadata)
130+
JSON.parse(raw_metadata) unless raw_metadata.nil?
131+
end
120132
end
121133
end
122134
end

0 commit comments

Comments
 (0)