module RedMatryoshka::RelatedCache
Public Instance Methods
remove_cache()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 44 def remove_cache retrieve_cache_klass(self).each do |klass| cache_klass = klass.new listener_options = cache_klass.classes_to_listen_for[self.class.name] cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil? RedMatryoshka::Cache.new(cache_klass).delete(record(klass).id) remove_sub_cache(klass) end end
remove_dependent_cache()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 57 def remove_dependent_cache retrieve_cache_klass(self).each do |klass| instantiate_klass = klass.new dependencies(instantiate_klass).each do |dependence| keys = keys_to_update(klass, dependence) redis.multi do keys.each do |key| redis.del key end end end end end
update_cache()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 15 def update_cache retrieve_cache_klass(self).each do |klass| cache_klass = klass.new listener_options = cache_klass.classes_to_listen_for[self.class.name] cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil? RedMatryoshka::Cache.new(cache_klass).cache(record(klass).reload) update_sub_cache(klass) end end
update_dependent_cache()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 28 def update_dependent_cache retrieve_cache_klass(self).each do |klass| instantiate_klass = klass.new hash = main_hash_for_dependence(klass) dependencies(instantiate_klass).each do |dependence| keys = keys_to_update(klass, dependence) redis.multi do keys.each do |key| redis.mapped_hmset(key, hash) end end end end end
Private Instance Methods
cache_klass_with_module(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 108 def cache_klass_with_module(klass) if RedMatryoshka.configuration.module.present? "#{RedMatryoshka.configuration.module}::#{klass}".constantize else klass.constantize end rescue NameError if klass.is_a? String klass.constantize else klass end end
dependencies(cache_klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 104 def dependencies(cache_klass) cache_klass.classes_dependencies_of.map { |klass| cache_klass_with_module(klass) } end
keys_to_update(klass, dependence)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 148 def keys_to_update(klass, dependence) redis.eval( lua_script, [ cache_klass_with_module(dependence).new.cache_key("*"), klass.new.cache_key("#{id}:id", false) ] ) end
lua_script()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 141 def lua_script File.open( File.dirname(__dir__) + "/utils/hassociate.lua", "rb" ).read end
main_hash_for_dependence(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 122 def main_hash_for_dependence(klass) cache_klass = klass.new listener_options = cache_klass.classes_to_listen_for[self.class.name] cache_klass.set_sub_id(send(listener_options[:sub])) unless listener_options[:sub].nil? hash = RedMatryoshka::Cache.new(cache_klass).cache_doll(record(klass).reload).flatten id = record(klass).id hash.inject({}) do |cache_hash, (k, v)| new_key = klass.new.cache_key("#{id}:#{k}", false) cache_hash.merge(new_key => v) end end
record(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 162 def record(klass) listener_options = klass.new.classes_to_listen_for[self.class.name] if listener_options[:record] != :self send(listener_options[:record]) else self end end
redis()
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 137 def redis @redis ||= RedMatryoshka.configuration.redis end
remove_sub_cache(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 86 def remove_sub_cache(klass) cache_klass = klass.new # TODO: Use LUA script instead sub_keys_to_update(klass).each do |key| redis.multi do redis.del key end end end
retrieve_cache_klass(record)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 97 def retrieve_cache_klass(record) RedMatryoshka::Base.descendants.inject([]) do |descendants, d| descendants << d if d.new.classes_to_listen_for.keys.include? record.class.name descendants end end
sub_keys_to_update(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 158 def sub_keys_to_update(klass) redis.keys(klass.new.cache_key("*:#{id}")) end
update_sub_cache(klass)
click to toggle source
# File lib/red_matryoshka/related_cache.rb, line 74 def update_sub_cache(klass) cache_klass = klass.new hash = RedMatryoshka::Cache.new(cache_klass).cache_doll(record(klass)).flatten # TODO: Use LUA script instead sub_keys_to_update(klass).each do |key| redis.multi do redis.mapped_hmset(key, hash) end end end