Class: LinkIO::Storage::RedisStorage

Inherits:
Base
  • Object
show all
Defined in:
lib/linkio/storage/redis_storage.rb

Overview

A Redis-backed store suitable for production. Pass any client that responds to the standard redis gem methods (get, set, del). Pending links are written with a TTL so they expire automatically.

require "redis"
storage = LinkIO::Storage::RedisStorage.new(Redis.new)

Keys are namespaced identically to the Node.js backend (linkio:pending:*, linkio:fingerprint:*, linkio:referral:*, linkio:referrer:*) so the two implementations can share a Redis.

Constant Summary collapse

PENDING_PREFIX =
"linkio:pending:"
FINGERPRINT_PREFIX =
"linkio:fingerprint:"
REFERRAL_PREFIX =
"linkio:referral:"
REFERRER_PREFIX =
"linkio:referrer:"

Instance Method Summary collapse

Constructor Details

#initialize(redis) ⇒ RedisStorage

Returns a new instance of RedisStorage.

Parameters:

  • redis (Object)

    a redis client (e.g. Redis.new)



24
25
26
27
# File 'lib/linkio/storage/redis_storage.rb', line 24

def initialize(redis)
  super()
  @redis = redis
end

Instance Method Details



37
38
39
40
# File 'lib/linkio/storage/redis_storage.rb', line 37

def delete_pending_link(device_id)
  @redis.del("#{PENDING_PREFIX}#{device_id}")
  nil
end


50
51
52
53
# File 'lib/linkio/storage/redis_storage.rb', line 50

def delete_pending_link_by_fingerprint(fingerprint)
  @redis.del("#{FINGERPRINT_PREFIX}#{fingerprint}")
  nil
end


33
34
35
# File 'lib/linkio/storage/redis_storage.rb', line 33

def get_pending_link(device_id)
  read_pending("#{PENDING_PREFIX}#{device_id}")
end


46
47
48
# File 'lib/linkio/storage/redis_storage.rb', line 46

def get_pending_link_by_fingerprint(fingerprint)
  read_pending("#{FINGERPRINT_PREFIX}#{fingerprint}")
end

#get_referral_by_referee(referee_id) ⇒ Object



75
76
77
78
# File 'lib/linkio/storage/redis_storage.rb', line 75

def get_referral_by_referee(referee_id)
  raw = @redis.get("#{REFERRAL_PREFIX}#{referee_id}")
  raw ? ReferralData.from_h(JSON.parse(raw)) : nil
end

#get_referrals_by_referrer(referrer_id) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/linkio/storage/redis_storage.rb', line 67

def get_referrals_by_referrer(referrer_id)
  referee_ids = read_json("#{REFERRER_PREFIX}#{referrer_id}") || []
  referee_ids.map do |referee_id|
    raw = @redis.get("#{REFERRAL_PREFIX}#{referee_id}")
    raw && ReferralData.from_h(JSON.parse(raw))
  end.compact
end


29
30
31
# File 'lib/linkio/storage/redis_storage.rb', line 29

def save_pending_link(device_id, data)
  write_pending("#{PENDING_PREFIX}#{device_id}", data)
end


42
43
44
# File 'lib/linkio/storage/redis_storage.rb', line 42

def save_pending_link_by_fingerprint(fingerprint, data)
  write_pending("#{FINGERPRINT_PREFIX}#{fingerprint}", data)
end

#save_referral(referral) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/linkio/storage/redis_storage.rb', line 55

def save_referral(referral)
  return if get_referral_by_referee(referral.referee_id)

  @redis.set("#{REFERRAL_PREFIX}#{referral.referee_id}", JSON.generate(referral.to_h))

  referrer_key = "#{REFERRER_PREFIX}#{referral.referrer_id}"
  list = read_json(referrer_key) || []
  list << referral.referee_id
  @redis.set(referrer_key, JSON.generate(list))
  nil
end