2016-05-14 12 views
1

Ich frage mich, was ist die ultimative Lösung für ein Cache-Management. Angenommen, ich habe einen einzelnen Server und eine unbegrenzte Anzahl von Clients, die damit verbunden sind. sendet der Client weiterhin Suchanfragen an den Server (lässt die Suchanforderung des Clients -'x 'aufrufen) und der Server antwortet dem Client mit "ein bisschen". jetzt, um meine Suchmaschine zu beschleunigen Ich möchte die beliebtesten Anfragen (x) im Cache-Speicher und ihre Antworten (y) zu speichern. (Beachten Sie, dass es für jedes x wichtig ist, das die Clients an den Server senden, sie müssen das gleiche y erhalten). Ich habe auch eine Datenbank, die alle vorherigen Anfragen (x, y, z-Anzahl der Male x angefordert) enthalten.Cache-Verwaltung in der Suchmaschine

Ich habe einige Probleme erfüllt, während die Cache-Aktualisierung:

  1. , wie ich meine am wenigsten beliebte Anfrage bleibt innerhalb des Cache, um es sagen kann, in welcher Index zu ersetzen, wenn ich einen populäreren Abfrage finden in meiner Datenbank (ohne den gesamten Cache zu scannen).

  2. Wie sollte ich den Cache aktualisieren? (scannen Sie einfach die ganze Datenbank? Das ist ziemlich teuer Operation)

3. Wie viel Anfrage Elemente sollte mein Cache enthalten?

4.Du denkst du eine HashMap ist eine effiziente Datenstruktur, um einen Cache zu verwalten? (Ich arbeite mit Java).

5.i hat darüber nachgedacht, meinen Cache basierend auf den letzten T- (einige) Abfragen zu aktualisieren und ihn nicht zu aktualisieren, während alle Anforderungen in der Datenbank durchlaufen werden. weil es vielleicht Anfragen gibt, die früher sehr populär waren und sie nicht mehr populär sind, und wenn es eine neue populäre Anfrage gibt, kann es lange dauern, bis sie in den Cache auf der Grundlage der Anzahl der Shows gelangt (sie muss auch schneller sein) Ich muss nicht die ganze Datenbank scannen). Ist das eine legitime Möglichkeit, einen Cache zu verwalten?

+0

Diese Frage ist zu weit für StackOverflow. Außerdem fragt die Frage nicht nach Hilfe mit Code, den Sie bereits geschrieben haben; es ist eher konzeptionell. – CConard96

Antwort

1

Ein Junggeselle bat den Computer, ihm den perfekten Partner zu finden.

„Ich möchte ein Begleiter, der kleine und attraktiv ist, Wassersport liebt und genießt Gruppenaktivitäten.“

Der Computer antwortete: „Mary einen Pinguin“

(Zitat aus: http://www.recipeapart.com/perfect-partner/#ixzz48iEVSp1y)

Wenn Sie eine unbegrenzte Anzahl von Clients haben, ist die ultimative Cache-Lösung, damit die Clients Ihre Daten weiterleiten. Du kannst das mit dem Internet machen. Beispielanwendungen, die das tun, sind z.B. Bit Torrent.

Wenn Sie Ihre Anforderungen Open Source Java-Cache-Implementierungen auf den verschiedenen nach unten schauen verengt:

  • Apache Ignite
  • Apache Java-Caching-System
  • Apache Geode
  • inifinispan
  • Hazelcast
  • EHCache
  • Google Guava
  • Caffeine
  • cache2k

starten zu verwenden. Lesen Sie die Handbücher.

Lesen Sie mein Blog unter: cruftex.net

Verschiedene Szenarien erfordern unterschiedliche Lösungen.

Soweit ich weiß, ist es keinem dieser Projekte gelungen, den ultimativen Cache zu erstellen. Soweit ich weiß, ist kein Benutzer bekannt, der den ultimativen Cache hat, indem er alle aktuellen Implementierungen verwendet.

Vielleicht sollte ich meine Cache-Implementierung den "ultimativen Cache" nennen. Aber dann würde es nicht existieren.

0

Hier sind einige Gedanken:

  1. Ein typischer Cache speichert Werte durch einen Hash-Code einer Anforderung indiziert zwischengespeichert. Wenn Sie also die Anfrage kennen, sollten Sie den Cache darauf basierend ungültig machen können. Oder Sie können einen angemessenen Ablaufzeitraum verwenden und die Cache-API würde abgelaufene Elemente automatisch entfernen.

  2. Aktualisierung des Caches. Wenn Sie Ihre Daten in einem DB gespeichert haben, verwenden Sie am besten aktualisierte Zähler oder Zeitstempel, die in der Datenbank gespeichert sind. Wenn eine Anforderung eingeht und die zwischengespeicherte Anforderung einen anderen Zeitstempel hat als die DB, wird sie zeitweise vollständig aus der Datenbank gelesen. Cacheonix speichert SQL-Abfragen mit seiner DataSource-API.

  3. Für die Größe des Caches sollte es groß genug sein, um eine gesunde Trefferquote zu erhalten, etwas um 80%. Gleichzeitig möchten Sie die Bytegröße des Caches begrenzen, um zu vermeiden, dass der Arbeitsspeicher knapp wird.

  4. HashMaps eignen sich nicht so gut zum Caching, da sie aufgrund der Größe und vieler anderer Probleme keine sinnvolle Nebenläufigkeit und Räumung bieten. Es gibt ein paar Produktions-Cache-APIs und Sie können Cacheonix zu der Liste hinzufügen.

  5. Eine Cache-API sollte Ihnen viele Möglichkeiten bieten, den Cache auf dem neuesten Stand zu halten, von der LRU-Räumung über die Vertreibung von Byte-Größe bis hin zu benutzerdefinierten DataSources, aber letztendlich hängt dies von Ihrer Geschäftslogik ab.