53 lines
1.3 KiB
Ruby
53 lines
1.3 KiB
Ruby
module RedisQueryable
|
|
|
|
VALID_NAMESPACES = [ :artist, :album, :chart ]
|
|
EXPIRATION = {
|
|
:artist => { :tracks => 3, :albums => 7, :similar => 14, :info => 7 },
|
|
:chart => { :tracks => 10, :artists => 10 },
|
|
:album => 28
|
|
}
|
|
|
|
def self.store namespace, key_hash, value
|
|
key = build_key key_hash.values
|
|
redis = switch_to_namespace namespace
|
|
|
|
expires = key_hash.has_key?(:type) ? EXPIRATION[namespace][key_hash[:type]] : EXPIRATION[namespace]
|
|
redis.setex key, expires.to_i.days, value
|
|
end
|
|
|
|
def self.get namespace, key_hash
|
|
key = build_key key_hash.values
|
|
redis = switch_to_namespace namespace
|
|
json = redis.get key
|
|
Hashie::Mash.new(JSON.parse(json))
|
|
end
|
|
|
|
def self.look_up_key namespace, key_hash, &block
|
|
if exists_key? namespace, key_hash
|
|
get namespace, key_hash
|
|
else
|
|
block.call
|
|
end
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def self.exists_key? namespace, key_hash
|
|
key = build_key key_hash.values
|
|
redis = switch_to_namespace namespace
|
|
redis.exists key
|
|
end
|
|
|
|
def self.build_key key_array
|
|
key_array.flatten.map do |value|
|
|
value.is_a?(String) ? Digest::SHA1.hexdigest(value) : value.to_s
|
|
end.join(":")
|
|
end
|
|
|
|
def self.switch_to_namespace namespace
|
|
return Redis::Namespace.new(namespace, :redis => $redis) if VALID_NAMESPACES.include? namespace
|
|
$redis
|
|
end
|
|
|
|
end |