2009-05-09 4 views
14

Da Datenbanktransaktionen in unserer App immer zeitraubender werden, haben wir begonnen, Memcached zu verwenden, um die Anzahl der an MySQL übergebenen Abfragen zu reduzieren.Best Practices für die Verwendung von Memcached in Rails?

Alles in allem funktioniert es gut und spart wirklich viel Zeit.

Aber wie Caching wurde als Abhilfe „still erscheinen“, um die App mehr Saft zu geben, viele unserer Modelle jetzt enthalten Code wie folgt aus:

def self.all_cached 

    Rails.cache.fetch('object_name') { 

    find(

     :all, 
     :include => [associations]) 

    } 

end 

Dies wird immer mehr und mehr Schmerzen als Füllung und das Löschen des Cache erfolgt in mehreren Klassen über die Anwendung.

Nun habe ich mich gefragt, ob es eine bessere Möglichkeit gibt, Memcached-Logik zu abstrahieren, um sie leistungsfähiger und einfacher für alle benötigten Modelle zu machen?

Ich habe über eine Art Memcached-Modul nachgedacht, das in allen benötigten Modulen enthalten ist.

Aber bevor um zu spielen, dachte ich: Die Experten der erste

Matt

Antwort

13

Ich würde empfehlen, die vorhandenen Plugins auschecken, die beiden großen sind cache_fu und cache money. Für die Verwendung Fall, in dem Sie das Modell mit seinen Assoziationen aus dem Cache geladen werden sollen würde ich empfehlen, dass Sie Cache Geld versuchen, die es funktioniert fast automatisch:

def parent < ActiveRecord::Base 
    has_many children 
end 

def child < ActiveRecord::Base 
    index :parent_id 
end 

#now you can do the following without ever hitting the DB 
parents = Parent.find :all 
parents.each{ |p| p.children } 

Der wirklich große Gewinn mit Cache-Geld ist, dass, wenn Sie skalieren bis zu dem Punkt, an dem die Verzögerung der Datenbankreplikation zum Problem wird. Dies ist besonders wichtig bei Rails, bei denen Replikationsverzögerungen leicht zu 500 Fehlern führen können und im Allgemeinen ein Albtraum sind, den Sie nicht haben möchten.

5

:-)

Dank fragen Lassen Sie Ja, ein Memcached Modul, das Sie in allen Modellen enthalten, die Sie es brauchen Ich denke, das ist die beste Lösung. Ihre Linie des Denkens ist hervorragend :)

+1

Danke, funktioniert brilliant. – Matt

+3

können Sie einen empfehlen oder sagen Sie einen von Grund auf neu schreiben? Diese Antwort scheint nicht vollständig zu sein –