2017-08-22 1 views
0

Ich habe ca. 3MB an Informationen, die sehr schwer zu produzieren sind. Es ist eine Kombination aus Join-Abfrage einiger sehr großer Tabellen und starker Verarbeitung nach der Abfrage. Um das zu vervollständigen, werden die resultierenden Informationen häufig gelesen (4-10 mal pro Minute pro Client, was 3000 für alle Clients ergibt).Cache Key-Strategie für große Datenmengen

Sollte ich diese Informationen im Cache unter einem einzigen Schlüssel speichern oder sollte ich sie brechen und die N Stücke jedes Mal abrufen, wenn ich sie brauche?

Details:
- Ich glaube nicht, dass dies eine „Meinung basierte Frage“, weil es möglich ist, mit dem Code zu beweisen, dass es ein besseres/schlechteren Szenarien
- ich nicht-emptively pre wissen kann welcher "Shard" die Informationen enthält, die ich brauche ... denke an es als Kontoauszüge, wo ein Bankmanager sowohl nach "Überweisungen" als auch nach "$ 1400.00" suchen kann ... daher muss ich das Ganze für weitere Filterung/Sortierung abrufen
- Die Daten sind nicht flach, aber es ist nicht , dass verschachtelt. Die meisten Artikel (ca. 70% sind nur 2 lvl, und der Rest geht 3 lvls)
- Ich verwende Redis als Caching-Server, und C# - Asp.Net MVC 4
- Filterung ist Single-Sourcing und angewendet auf 4 Felder (einzelnes Suchfeld, das versucht, den Wert auf 4 Feldern zu vergleichen).
- Die Sortierung erfolgt immer nach dem Datum

+0

Dies klingt wie eine klassische analytische Prozess/Data Warehouse-Situation. Können die resultierenden Daten in einer oder mehreren denormalisierten Datenbanktabellen gespeichert werden oder müssen sie unbedingt im Speicher zwischengespeichert werden? –

+0

@KarlWenzel Ich würde sagen, dass im Cache zwischengespeicherte ist viel performativer als jede Datenbank-Lösung aufgrund der Häufigkeit des Datenzugriffs ... rohe Schätzwerte auf über 3000 Zugriff pro Minute – Leonardo

+0

Ohne eine Datenbankabfrage-Engine, die Optimierung und Zwischenspeicherung zu behandeln von all dem Filtern/Sortieren, dann könnten Sie vielleicht Ihre eigenen Indizes erstellen? Vielleicht haben Sie eine Codebibliothek, die virtuelle Datentabellen in Ihrem Code unterstützt? Wie sehen Ihre Daten aus? Ist es ein flacher Tisch mit vielen Feldern oder gibt es viel Nesting? –

Antwort

0

Soll ich, dass Informationen über den Cache unter einer einzigen Taste oder soll ich es brechen und rufen Sie die Stücke N jedes Mal, wenn ich es brauchen?

Sie müssen berücksichtigen:

  • was die maximale Objektgröße (bis 1 MB Standard max_item_size für Memcached, aber 512 MB für redis String-Typ) cachen kann
  • was tatsächlich Sinn macht für Ihre Arbeit (zB Spaltung in N Stücke,? würden Sie die einzelnen Stücke überhaupt verwenden)

nach oben, dass ab, th Die resultierenden Informationen werden häufig gelesen (4-10 Mal pro Minute pro Client, was 3000 für alle Clients ergibt).

Auf der Grundlage dieser Aussage allein ist meine Interpretation, dass die gleiche Info 3000 mal zurückgeführt wird. Für einen einzelnen Schlüssel wären das 3000 Cacheanforderungen, für N Stücke wären dies N * 3000 Anfragen. Es ist schon leicht zu sehen, welches teurer ist. Plus die Rechenzeit, die benötigt wird, um die N Stücke zu kombinieren.

Unter Umständen können Sie beides tun:

  • Ihre Kunden-Anfragen die einzelnen Schlüssel verwenden lassen.
  • Lassen Sie Ihre Serverseite N Cacheschlüssel verwenden und verwenden Sie vorhandene Zwischenergebnisse nach Möglichkeit, kombinieren Sie sie und speichern Sie das Ergebnis mit dem einzigen Schlüssel.
Verwandte Themen