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