Shared Cache - Best Practice für die Invalidierung

14

Ich möchte wissen, was ein besserer Ansatz zum Ungültigmachen / Aktualisieren von Cache-Objekten wäre.

Voraussetzungen

  • Remotememcached Server (der als Cache für mehrere Anwendungen dient)
  • Alle Server werden von Azure gehostet (Affinitätsbereiche, gleiche Rechenzentren)
  • Die Größe des Cache-Objekts reicht von 200 Bytes bis zu 50 Kilobytes


Ansatz 1 (so schnell wie möglich im Cache speichern)

  1. Objekt A wird erstellt -> in Datenbank speichern und im Cache speichern
  2. Objekt A vom Client angefordert -> Cache auf Existenz prüfen, andernfalls aus der Datenbank holen und im Cache ablegen
  3. Objekt A wird aktualisiert -> in Datenbank speichern, im Cache speichern

Ansatz 1 scheint einfacher zu sein. Wenn etwas erstellt wird, legen Sie es so schnell wie möglich in den Cache. Egal, jemand wird es brauchen.


Ansatz 2 (Lazy Cache Store)

  1. Objekt A wird angelegt -> in Datenbank ablegen
  2. Objekt A vom Client angefordert -> Cache auf Existenz prüfen, andernfalls aus der Datenbank holen und im Cache ablegen
  3. Objekt A wird aktualisiert -> in Datenbank speichern, Schlüssel im Cache löschen

Ansatz 2 scheint speicherbewusster zu sein. Bei diesem Ansatz werden nur angeforderte Elemente in den Cache gestellt.


Frage 1: Was wäre im Hinblick auf die Leistung ein besserer Ansatz? Speicher oder CPU zählen noch nicht.

Frage 2: Sind meine Gedanken eine Art vorzeitige Optimierung?

Frage 3: Irgendwelche anderen Gedanken? Andere Ansätze?

lurkerbelow
quelle

Antworten:

12
  1. Ist nicht zu beantworten, außer zu sagen, es kommt darauf an. Es gibt viele Faktoren, die bestimmen, welcher Ansatz in Ihrem Fall der beste sein wird, z. B .: Ist es normal, dass erstellte Objekte kurz nach ihrer Erstellung abgerufen werden? Wie ist das Verhältnis von Updates zu Zugriffen?
  2. Re. Entscheiden, ob Sie einen Cache benötigen: Wenn Sie ohne Daten optimieren, ist dies eine technisch vorzeitige Optimierung. Ich sage technisch, da Erfahrung / konventionelle Weisheit Ihnen sagen kann, dass Sie eine Art Cache benötigen werden. Re. Entscheiden, wie der Cache am besten funktioniert: Ja, es ist definitiv eine vorzeitige Optimierung.
    • Bei der Optimierung geht es oft nicht darum, die beste / optimalste Lösung zu finden. Es sollte wie folgt gehen:
      1. Finden Sie die Engpässe im System.
      2. Finden Sie heraus, wo Sie mit dem geringsten Arbeitsaufwand den größten Unterschied machen können.
      3. Mache die wenigste Arbeit!
      4. Ist es schon schnell genug? Wenn nicht, gehe zu # 1.
      5. Erledigt!
    • Ehrlich gesagt klingt keiner der von Ihnen beschriebenen Ansätze kompliziert. Warum nicht beides implementieren und sehen, welches am besten funktioniert?
    • Schritt 3 in Ansatz 2 könnte in "Objekt A wird aktualisiert -> In Datenbank speichern, Eintrag im Cache aktualisieren" geändert werden.
vaughandroid
quelle
Baqueta, danke für deine Antwort. Ich schätze es.
Lurkerbelow
@ lurkerbelow Bin froh zu helfen.
Vaughandroid
2

memcached verwaltet Objekte mit einer eigenen Richtlinie. Dieses zwischengespeicherte Objekt läuft ab, wenn niemand darauf zugreift, oder wenn im memcached nicht genügend Arbeitsspeicher vorhanden ist. Daher ist Ihre erste Vorgehensweise keine gute Idee, da Ihr Objekt in memcached aufgrund von Speichermangel beim Erstellen von Objekten immer wieder ungültig wird.

Q1. Ansatz 2 wäre in Bezug auf die Leistung besser, da er kein Objekt an memcached sendet, obwohl die Leistungsverbesserung sehr gering ist.

Q2. Es ist schwer zu sagen. Angenommen, Sie kennen den Engpass und entwerfen die Ansätze, die nicht verfrüht wären.

Q3. Es gibt andere Ansätze wie Cache nur in Memcached.

Neo
quelle