Class: LinkIO::Storage::RedisStorage
- 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
- #delete_pending_link(device_id) ⇒ Object
- #delete_pending_link_by_fingerprint(fingerprint) ⇒ Object
- #get_pending_link(device_id) ⇒ Object
- #get_pending_link_by_fingerprint(fingerprint) ⇒ Object
- #get_referral_by_referee(referee_id) ⇒ Object
- #get_referrals_by_referrer(referrer_id) ⇒ Object
-
#initialize(redis) ⇒ RedisStorage
constructor
A new instance of RedisStorage.
- #save_pending_link(device_id, data) ⇒ Object
- #save_pending_link_by_fingerprint(fingerprint, data) ⇒ Object
- #save_referral(referral) ⇒ Object
Constructor Details
#initialize(redis) ⇒ RedisStorage
Returns a new instance of RedisStorage.
24 25 26 27 |
# File 'lib/linkio/storage/redis_storage.rb', line 24 def initialize(redis) super() @redis = redis end |
Instance Method Details
#delete_pending_link(device_id) ⇒ Object
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 |
#delete_pending_link_by_fingerprint(fingerprint) ⇒ Object
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 |
#get_pending_link(device_id) ⇒ Object
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 |
#get_pending_link_by_fingerprint(fingerprint) ⇒ Object
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 |
#save_pending_link(device_id, data) ⇒ Object
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 |
#save_pending_link_by_fingerprint(fingerprint, data) ⇒ Object
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 |