Frage

Angenommen, wir bauen eine E-Commerce-Website, die Verbraucher für die Produkte von der Eingabe in Stichworten suchen kann. Sprich gibt es höchstens 200.000 Produkte, und es gibt Millionen von Verbrauchern mit dem System. Lassen Sie uns sagen, dass die Produkttabelle ziemlich häufig aktualisiert wird. Da die Anzahl der Produkte, die nicht so hoch ist, und wir können wahrscheinlich die gesamte Produkttabelle im Speicher ablegen und gegen sie suchen, anstatt die Datenbank des Schlagens. Wir hoffen, verteilten Caches zu erstellen, die die gleichen Daten speichern, sondern befinden sich in unterschiedlichen Servern (für hohe Verfügbarkeit und Performance Grund), und wir müssen in der Lage, Daten zwischen diesen Caches und invalidate Caches zu synchronisieren, wenn Produkttabelle geändert wird.

Unsere Anwendung ist mit ASP.NET MVC und NHibernate gebaut. Ich versuche, ob NHibernate Level-2-Cache mit meiner Situation helfen würde, zu verstehen. Ich würde wirklich schätzen, wenn euch auf diesem etwas Licht können.

Ich verstehe, dass Level-2-Cache helfen Cache Abfrage-Ergebnis so, wenn zwei verschiedene Benutzer suchen das gleiche Schlüsselwort verwenden, wird die L2-Cache das Ergebnis aus dem Cache dienen, anstatt aus der Datenbank. Aber es macht uns nicht viel helfen, da die Produkttabelle häufig aktualisiert wird und das zwischengespeicherte Ergebnis wird abgestanden sein. Meine Frage ist, bin ich Verständnis L2 Cachen richtig und ist es etwas gibt, dass Hilfe verwalten Cache die Art und Weise Ich mag würde (mehrere Caches, die gleichen Daten, synchronisieren zwischen Cache und invalidate-Cache) zu tun. Irgendwelche Gedanken wird sehr geschätzt.

War es hilfreich?

Lösung

Nachdem verwendet sowohl der Second-Level-Cache (mit dem Memcached-Provider) und die NHibernate.Search Add-On es scheint mir, Sie beide profitieren könnten.

Die NHibernate.Search Komponente hängt von Lucene.Net und Keyword-Suche aus der Datenbank es selbst entkoppelt. Eine andere Indexdatei erstellt wird pro Klasse zugeordnet und Optimierungen können auf dem Grundstück Ebene mithilfe von Attributen festgelegt werden, können Sie ein zusätzliches Maß an Granularität geben. Darüber hinaus können Sie am besten entsprechen und Sätze (Check Lucene in Aktion und / oder Hibernate Search in Aktion) umzusetzen. Als Hinweis, müssen Sie nicht auf den Index erhalten (es sei denn, Sie explizit ein Index neu erstellen beantragen); die Umsetzung schafft alles hinter den Kulissen, obwohl Sie den Index manipulieren können, wenn Sie dies wünschen. So, das Hinzufügen / Löschen / ein Produkt Aktualisierung werden automatisch den entsprechenden Index aktualisieren.

Für die Second-Level-Cache Sie sofortigen Leistungsschub bekommen. Auf einer Testumgebung mit einem Datensatz von ca. 2 mil Reihen hatte ich mehr als 20% ige Verbesserung auch auf einem extrem niedrigen Anforderungszählspeicher. Die Leistungssteigerung wird allmählich größer, wenn die Abfragezahl steigt - die Anwendung trifft zuerst den zweiten Level-Cache und wenn es nicht es dann nicht finden trifft die DB die erforderlichen Zeilen und fügt sie auf dem Cache für zukünftige Anfragen zu holen. Auch hier kann man Sachen wie Cache-Dauer und andere Konfigurationseinstellungen verwalten, sowie explizit den Cache löschen (alle davon, einen Teil davon oder bestimmte Einträge), wenn Sie dies wünschen. Beachten Sie, dass Cache-Zustand durch die Anwendung beim Speichern / Update verwaltet wird / löschen.

Für scallability * Die zweite Level-Cache ist abhängig vom Anbieter (dh Memcached hochperformant und skalierbar und unterstützt Instanzen verteilt). * Für die Lucene.Net/NHibernate.Search benötigen Sie einen bestimmten Ort einzurichten, dass die Indizes befinden, und dieser Ort muss für Lese- / Schreib von allen Web-Anwendungsinstanzen zugänglich sein. Man beachte hier, dass die empfindliche Verbindung I / O und Dateikonflikt, so eine Maschine mit einer schneller als das Licht-Dateisystem einrichten wird dies verhindern, (i für Ihr Szenario mit vielen Tausenden von Suchanfragen pro Sekunde spreche)

Als Randnotiz würde ich sehr NHibernate.Search empfehlen, da es extrem schneller als LIKE Abfragen und ist einfacher zu benutzen als Implementierung SQL-Servers Volltext innerhalb der Anwendung suchen (was ich getan haben).

Andere Tipps

Ob ein Cache zweite Ebene wird dazu beitragen, hängt davon ab, genau, wie oft Ihre Produkttabelle in Bezug auf Cache-Hits aktualisiert wird. Wenn Sie 100 neue Produkte eine Stunde hinzuzufügen, aber erhalten 10.000 Abfragen pro Stunde, sogar eine 10% Cache-Trefferrate einen großen Unterschied machen. Wenn die Preise umgekehrt sind, ein Second Level Cache von fast keinen Wert sein wird.

Ich schlage vor, Sie eine Stresstest-Umgebung eingerichtet, dass möglichst nahe Umgebung Produktion und perform Benchmarking auf den verschiedenen Second Level Cache-Provider.

überprüfen Sie auch, dass Ihre DB für ein Update lastigen Szenario richtig konfiguriert ist.

Ich empfehle, mit NHibernate.Search w / Lucene. Er arbeitet mit dem zweiten Level-Cache zusammen. Lucene können anspruchsvolle Textsuche machen schnell zerreißt und dann die Entitätsschlüsseln zu NHibernate wieder zurück, die aus seinem zweiten Level-Cache die volle Einheit zieht. Die NHibernate.Search Erweiterung macht die Arbeit zu halten Ihren Lucene Index synchron.

TekPub hat eine aktuelle Folge auf Ihrem genaues Szenario von Produktbeschreibungen suchen. Die Folge vergleicht NHibernate Abfragen, SQL Volltextindizierung und Lucene w / NHibernate.Search.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top