class SwitchBoard::RedisDataset

Constants

LOCK_MAP_KEY

Attributes

con[RW]
name[RW]
switchboard[RW]

Public Class Methods

new(host = "127.0.0.1", port = 6379, name = "redis_switchbord") click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 13
def initialize(host = "127.0.0.1", port = 6379, name = "redis_switchbord")
  @con = Redis.new(:host => host, :port => port)
  @name = name
end

Public Instance Methods

cleanup() click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 18
def cleanup
  ## clean up keys, used mainly for testing
  @con.del @name
  @con.del "#{LOCK_MAP_KEY}_z"
  @con.del "#{LOCK_MAP_KEY}_h"
end
get_all_locked_ids() click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 69
def get_all_locked_ids
  clean_old_keys
  @con.hgetall "#{LOCK_MAP_KEY}_h"
end
get_all_my_locked_ids(uid) click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 79
def get_all_my_locked_ids(uid)
  res = get_all_locked_ids
  get_all_locked_ids.select {|key, key_uid|  key_uid.to_s == uid.to_s }
end
get_all_their_locked_ids(uid) click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 74
def get_all_their_locked_ids(uid)
  res = get_all_locked_ids
  res.reject {|key, key_uid|  key_uid.to_s == uid.to_s }
end
get_locked() click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 25
def get_locked
  active_lockers = list_lockers.map { |item| JSON.parse(item)}
  active_lockers
end
id_locked?(id_to_check) click to toggle source

Check if key exists to see if it is locked and it has not expired before getting keys, remove expired keys

# File lib/switch_board/datasets/redis_dataset.rb, line 60
def id_locked?(id_to_check)
  @con.hexists("#{LOCK_MAP_KEY}_h", id_to_check)
end
list_lockers() click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 40
def list_lockers
  list_lockers ||= (@con.smembers @name).map { |item| JSON.parse(item)}
end
lock_id(locker_uid, id_to_lock, expire_in_sec = 5) click to toggle source

Locking mechanisem is based on sorted set, sorted set is used to allow a simulation

of expiration time on the keys in the map
# File lib/switch_board/datasets/redis_dataset.rb, line 50
def lock_id(locker_uid, id_to_lock, expire_in_sec = 5)
  now = redis_time
  @con.multi do
    @con.zadd("#{LOCK_MAP_KEY}_z", (now + expire_in_sec), id_to_lock)
    @con.hset("#{LOCK_MAP_KEY}_h", id_to_lock, locker_uid)
  end
end
locker(uid) click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 44
def locker(uid)
  (list_lockers.select {|locker| locker["uid"] == uid}).first
end
register_locker(uid, name) click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 34
def register_locker(uid, name)
  @con.sadd @name, {uid: uid, name: name, created_at: redis_time}.to_json.to_s
  list_lockers ## update lockers list
  true
end
unlock_id(locker_uid, id_to_unlock) click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 65
def unlock_id(locker_uid, id_to_unlock)
  @con.hdel("#{LOCK_MAP_KEY}_h", id_to_unlock)
end

Private Instance Methods

clean_old_keys() click to toggle source

Private Methods #################

# File lib/switch_board/datasets/redis_dataset.rb, line 87
def clean_old_keys
  keys = @con.zrangebyscore("#{LOCK_MAP_KEY}_z", 0, redis_time)
  if keys.size > 0
    @con.zremrangebyscore("#{LOCK_MAP_KEY}_z", 0, redis_time)
    keys.each {|key| @con.hdel("#{LOCK_MAP_KEY}_h", key)}
  end
end
redis_time() click to toggle source
# File lib/switch_board/datasets/redis_dataset.rb, line 95
def redis_time
  instant = @con.time
  Time.at(instant[0], instant[1]).to_i
end