class Ablab::Store::Redis
Attributes
redis[R]
Public Class Methods
new(opts = {})
click to toggle source
# File lib/ablab/store/redis.rb, line 8 def initialize(opts = {}) @key_prefix = opts[:key_prefix] || 'ablab:1' @redis = ::Redis.new(opts) @session_duration = opts[:session_duration] || (60 * 30) end
Public Instance Methods
conversions(experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 39 def conversions(experiment, bucket) c, z = nil, nil redis.multi do c = redis.zcard(key(:conversions, experiment, bucket)) z = redis.get(key(:'conversions:spool', experiment, bucket)) end (c.value || 0).to_i + (z.value || 0).to_i end
counts(experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 48 def counts(experiment, bucket) v, s, k, x, c, z = nil, nil, nil, nil, nil, nil redis.multi do v = redis.get(key(:views, experiment, bucket)) s = redis.zcard(key(:sessions, experiment, bucket)) k = redis.get(key(:'sessions:spool', experiment, bucket)) x = redis.get(key(:successes, experiment, bucket)) c = redis.zcard(key(:conversions, experiment, bucket)) z = redis.get(key(:'conversions:spool', experiment, bucket)) end { views: (v.value || 0).to_i, sessions: (s.value || 0).to_i + (k.value || 0).to_i, successes: (x.value || 0).to_i, conversions: (c.value || 0).to_i + (z.value || 0).to_i } end
sessions(experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 26 def sessions(experiment, bucket) s, z = nil, nil redis.multi do s = redis.zcard(key(:sessions, experiment, bucket)) z = redis.get(key(:'sessions:spool', experiment, bucket)) end (s.value || 0).to_i + (z.value || 0).to_i end
successes(experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 35 def successes(experiment, bucket) (redis.get(key(:successes, experiment, bucket)) || 0).to_i end
track_success!(experiment, bucket, session_id)
click to toggle source
# File lib/ablab/store/redis.rb, line 18 def track_success!(experiment, bucket, session_id) track(experiment, bucket, session_id, :successes, :conversions) end
track_view!(experiment, bucket, session_id)
click to toggle source
# File lib/ablab/store/redis.rb, line 14 def track_view!(experiment, bucket, session_id) track(experiment, bucket, session_id, :views, :sessions) end
views(experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 22 def views(experiment, bucket) (redis.get(key(:views, experiment, bucket)) || 0).to_i end
Private Instance Methods
key(type, experiment, bucket)
click to toggle source
# File lib/ablab/store/redis.rb, line 66 def key(type, experiment, bucket) "#{@key_prefix}:#{type}:#{experiment}:#{bucket}" end
spool_set!(experiment, bucket, set)
click to toggle source
# File lib/ablab/store/redis.rb, line 79 def spool_set!(experiment, bucket, set) n = redis.zremrangebyscore(key(set, experiment, bucket), 0, Time.now.to_i - @session_duration) redis.incrby(key("#{set}:spool", experiment, bucket), n) end
track(experiment, bucket, session_id, counter, set)
click to toggle source
# File lib/ablab/store/redis.rb, line 70 def track(experiment, bucket, session_id, counter, set) return false if bucket.nil? redis.pipelined do redis.incr(key(counter, experiment, bucket)) redis.zadd(key(set, experiment, bucket), Time.now.to_i, session_id) end spool_set!(experiment, bucket, set) if rand(100) < 1 end