Heim  >  Artikel  >  Datenbank  >  Was sind die Wissenspunkte des Redis-Projekts?

Was sind die Wissenspunkte des Redis-Projekts?

WBOY
WBOYnach vorne
2023-05-27 19:55:251548Durchsuche

Highlights des Projekts:

1. Durch die Verwendung von verteiltem Seesion können mehrere Server gleichzeitig reagieren.

2. Verwenden Sie Redis als Cache, um die Zugriffsgeschwindigkeit und Parallelität zu verbessern, den Datenbankdruck zu verringern und Speichertags zu verwenden, um den Redis-Zugriff zu reduzieren.

3. Verwenden Sie statische Seiten, um den Benutzerzugriff zu beschleunigen, QPS zu verbessern, Seiten im Browser zwischenzuspeichern und Front-End und Back-End zu trennen, um den Serverdruck zu verringern.

4. Verwenden Sie die Nachrichtenwarteschlange, um die asynchrone Bestellung abzuschließen, die Benutzererfahrung zu verbessern, Spitzen zu reduzieren und den Datenverkehr zu reduzieren.

5. Sicherheitsoptimierung: doppelte MD5-Passwortüberprüfung, Ausblenden der Flash-Kill-Schnittstellenadresse, Schnittstellenstrombegrenzung und Anti-Brushing, Code zur Überprüfung der mathematischen Formel.

Wichtige Wissenspunkte:

Verteilte Seesion

Die eigentliche Anwendung unseres Flash-Sale-Dienstes kann nicht nur auf einem Server bereitgestellt, sondern auf mehreren Servern verteilt werden Die erste Anfrage geht an den ersten Server, die zweite Anfrage geht jedoch an den zweiten Server, sodass die Sitzungsinformationen des Benutzers verloren gehen.

Lösung: Sitzungssynchronisierung. Unabhängig davon, auf welchen Server zugegriffen wird, kann die Sitzung mithilfe der Redis-Cache-Methode abgerufen werden und ein Redis-Server speziell zum Speichern der Sitzungsinformationen des Benutzers verwendet werden. Auf diese Weise geht die Benutzersitzung nicht verloren. (Jedes Mal, wenn Sie eine Sitzung benötigen, holen Sie sie einfach aus dem Cache)

redis entlastet die Datenbank

Dieses Projekt nutzt in großem Umfang die Caching-Technologie, einschließlich Zwischenspeicherung von Benutzerinformationen (verteilte Sitzung), Zwischenspeicherung von Produktinformationen, Zwischenspeicherung von Produktbeständen usw Auftrags-Caching, Seiten-Caching und Objekt-Caching reduzieren den Zugriff auf den Datenbankserver.

Universelle Cache-Schlüsselkapselung

Ein Problem besteht darin, Caches in verschiedenen Modulen zu unterscheiden, da möglicherweise derselbe Schlüsselwert vorhanden ist

Lösung: Verwenden Sie eine abstrakte Klasse, um BaseKey (Präfix) zu definieren und das Präfix des Cache-Schlüssels zu definieren Der Cache darin Die Ablaufzeit ermöglicht die Kapselung des zwischengespeicherten Schlüssels. Lassen Sie es von verschiedenen Modulen erben, sodass jedes Mal, wenn es im Cache eines Moduls gespeichert wird, ein Cache-spezifisches Präfix hinzugefügt wird und unterschiedliche Ablaufzeiten einheitlich festgelegt werden können.

Seitenstatik (Trennung von Front- und Backend)

Der Hauptzweck der Seitenstatik besteht darin, das Laden der Seite zu beschleunigen. Die Produktdetailseiten und Bestelldetailseiten werden in statisches HTML (reines HTML) umgewandelt Daten müssen nur über Ajax übermittelt werden, um den Server anzufordern und eine statische HTML-Seite zu erstellen, die im Browser des Clients zwischengespeichert werden kann.

Nachrichtenwarteschlange, um die asynchrone Bestellung abzuschließen

Verwenden Sie die Nachrichtenwarteschlange, um die asynchrone Bestellung abzuschließen, die Benutzererfahrung zu verbessern, Spitzen zu reduzieren und den Datenverkehr zu reduzieren.

Ideen:

1. Systeminitialisierung, Laden des Produktbestands in Redis.

2. Das Backend empfängt die Flash-Sale-Anfrage und Redis reduziert den Lagerbestand vorab. Wenn der Lagerbestand den kritischen Wert erreicht hat, besteht keine Notwendigkeit, die Anfrage fortzusetzen, und es wird direkt ein Fehler zurückgegeben, d. h. eine große Anzahl Folgeanfragen müssen das System nicht belasten.

3. Stellen Sie fest, ob der Flash-Sale-Auftrag erstellt wurde, stellen Sie fest, ob der Flash-Sale eingetroffen ist, vermeiden Sie mehrere Produkte von einem Konto und stellen Sie fest, ob der Flash-Sale wiederholt wird.

4. Wenn der Bestand ausreicht und keine doppelten Flash-Verkäufe vorliegen, wird die Flash-Verkaufsanforderung gekapselt und die Nachricht in die Warteschlange gestellt, und ein Code (0) wird an das Frontend zurückgegeben, was bedeutet, dass sie zurückgegeben wird in die Warteschlange. (Was zurückgegeben wird, ist kein Fehler oder Erfolg und kann zu diesem Zeitpunkt nicht beurteilt werden)

5 Nachdem das Frontend die Daten empfangen hat, zeigt es die Warteschlange an und fragt den Anforderungsserver entsprechend der Produkt-ID ab (erwägen Sie eine einmalige Abfrage). 200ms).

6. Das Back-End-RabbitMQ überwacht den Kanal mit dem Namen MIAOSHA_QUEUE. Wenn eine Nachricht vorliegt, muss es die eingehenden Informationen abrufen und den Bestand der Datenbank beurteilen , um den Flash-Sale zu wiederholen und dann die Flash-Sale-Transaktion auszuführen (Die Flash-Sale-Transaktion ist eine atomare Operation: den Bestand um 1 verringern, eine Bestellung aufgeben und den Flash-Sale-Auftrag schreiben).

7. Zu diesem Zeitpunkt fragt das Frontend die Anforderungsschnittstelle MiaoshaResult basierend auf der Produkt-ID ab, um zu prüfen, ob eine Produktbestellung generiert wurde. Wenn die Anforderung -1 zurückgibt, bedeutet dies, dass der Flash-Verkauf fehlgeschlagen ist, und wenn sie 0 zurückgibt , bedeutet dies, dass es sich in der Warteschlange befindet. Wenn es >0 zurückgibt, bedeutet dies, dass die Produkt-ID bedeutet, dass der Flash-Verkauf erfolgreich war.

Sicherheitsoptimierung

Doppelte MD5-Passwortüberprüfung, Ausblenden der Flash-Kill-Schnittstellenadresse, Schnittstellenstrombegrenzung und Anti-Swiping, Verifizierungscode für mathematische Formeln.

Elegantes Schreiben von Code

Das Ausgabeergebnis der Schnittstelle wird als Ergebnis gekapselt

Der falsche Code wird als CodeMsg gekapselt

Der Zugriffscache wird als Schlüssel gekapselt

Projektschwierigkeiten und Problemlösung:

1 . Bei der Verwendung von JMeter für Stresstests sind 5000 Threads aktiviert, aber das System kann nicht ausgeführt werden und es tritt eine Ausnahme auf

Ursache: Ändern Sie das Redis-Konfigurationselement poolMaxTotal in der Konfigurationsdatei und setzen Sie es auf 1000.

#redis-Konfigurationselement

redis.poolMaxTotal=1000

redis.poolMaxldle=500

redis.poolMaxWait=500

2. Wenn eine große Menge an Cache verwendet wird, kommt es zu einem Cache-Ausfall, einer Cache-Lawine und einem Cache Konsistenz usw. Frage?

Cache-Penetration bezieht sich auf die Anforderung bestimmter Daten, die nicht vorhanden sein dürfen. Die Anforderung dringt in den Cache ein und erreicht die Datenbank.

Lösung: Leere Daten für diese nicht vorhandenen Daten zwischenspeichern und solche Anfragen filtern.

Cache-Lawine bezieht sich auf die Tatsache, dass die Daten nicht in den Cache geladen werden oder die zwischengespeicherten Daten gleichzeitig in einem großen Bereich ausfallen (ablaufen) oder der Cache-Server ausgefallen ist, was dazu führt, dass eine große Anzahl von Anfragen eintrifft die Datenbank.

Lösung:

Um gleichzeitig Cache-Lawinen durch Cache-Ablauf in einem großen Bereich zu verhindern, können Sie das Benutzerverhalten beobachten und die Cache-Ablaufzeit angemessen einstellen.

Um Cache-Lawinen durch Cache-Server-Ausfälle zu verhindern, können Sie Folgendes verwenden: Verteilter Cache. Jeder Knoten im Cache speichert nur einen Teil der Daten. Wenn ein Knoten ausfällt, kann sichergestellt werden, dass der Cache anderer Knoten weiterhin verfügbar ist.

Sie können auch eine Cache-Vorwärmung durchführen, um eine Cache-Lawine zu vermeiden, da große Datenmengen nicht kurz nach dem Systemstart zwischengespeichert werden.

Zum Beispiel: Legen Sie zunächst unterschiedliche Ablaufzeiten für verschiedene Caches fest, z. B. für den Sitzungscache. Im UserKey-Präfix ist die Einstellung so, dass sie in 30 Minuten abläuft, und die Cache-Zeit wird jedes Mal aktualisiert, wenn der Benutzer antwortet. Jede Sitzungserfassung wird um 30 Minuten verlängert, sodass die Wahrscheinlichkeit eines Cache-Ablaufs relativ gering ist. Die Cache-Konsistenz erfordert, dass die zwischengespeicherten Daten in Echtzeit aktualisiert werden können, während die Daten aktualisiert werden.

Lösung:

Aktualisieren Sie den Cache sofort, wenn die Daten aktualisiert werden, und kehren Sie direkt nach dem Lesen der Daten zurück, lesen Sie die Datenbank, schreiben Sie die Daten in den Cache zurückkehren.

Bevor Sie den Cache lesen, stellen Sie zunächst fest, ob der Cache der neueste ist. Wenn die Daten aktualisiert werden müssen, aktualisieren Sie zuerst die Datenbank und entkräften (löschen) Sie dann die entsprechenden Daten der Cache.

3. Eine umfangreiche Nutzung des Caches übt großen Druck auf den Cache-Server aus. Denken Sie darüber nach, wie Sie den Redis-Zugriff reduzieren können.

Wenn Redis den Bestand vorab reduziert, wird eine isOvermap als Speichermarkierung im Speicher beibehalten. Wenn kein Bestand vorhanden ist, wird er auf true gesetzt. Überprüfen Sie die Kartenmarkierung, bevor jedes Flash-Sale-Unternehmen auf Redis zugreift. Wenn dies der Fall ist, bedeutet dies, dass kein Inventar vorhanden ist, und es wird direkt ein Fehler zurückgegeben, ohne den Redis-Server anzufordern.

4. In einem Geschäftsszenario mit vielen gleichzeitigen Anfragen, wenn eine große Anzahl von Anfragen zu spät für die Bearbeitung ist oder sich die Anfragen sogar häufen?

Nachrichtenwarteschlange, die zur asynchronen Verarbeitung von Anforderungen verwendet wird. Jedes Mal, wenn eine Anfrage eingeht, wird die Anfrage nicht verarbeitet, sondern in die Nachrichtenwarteschlange gestellt. Anschließend wird im Hintergrund ein Listener eingerichtet, der die Nachrichtenwarteschlangen verschiedener Unternehmen abhört. Wenn eine Nachricht eingeht, wird die Geschäftslogik ausgeführt . Dies verhindert die Ausnahme von zu vielen Datenbankverbindungen, wenn mehrere Anfragen gleichzeitig bearbeitet werden.

5. Wie kann sichergestellt werden, dass ein Benutzer keine wiederholten Bestellungen aufgeben kann?

Lösung: Erstellen Sie einen eindeutigen Index in der Flash-Verkaufsauftragstabelle (die Referenz ist die Benutzer-ID und die Waren-ID), sodass der erste Datensatz eingefügt werden kann, der zweite jedoch einen Fehler macht, und führen Sie dann einen Rollback durch die Transaktion durch um zu verhindern, dass ein Benutzer mehrere Datensätze gleichzeitig ausgibt. Bearbeitung von Anfragen, sofortiger Verkauf mehrerer Produkte.

Eindeutiger Index bedeutet Eindeutigkeit. Nach dem Hinzufügen eines eindeutigen Index zu einem Feld in der Datenbanktabellenstruktur ermittelt die Datenbank, ob die Daten bereits in der Datenbank vorhanden sind. Der Einfügungsvorgang kann nur ausgeführt werden Die Daten existieren nicht.

Obwohl dies eine kleine Fähigkeit ist, handelt es sich tatsächlich um eine sehr praktische Fähigkeit in der Geschäftsentwicklung. Wie kann die Datenbank beispielsweise verhindern, dass Daten gleichzeitig zwei identische Bestellnummern einfügen? Das Hinzufügen eines eindeutigen Index ist natürlich eine der schnellsten Möglichkeiten. Ob ein Index hinzugefügt oder durch Geschäftscode gelöst werden soll, hängt natürlich vom Geschäft des Unternehmens ab

6.

Überverkauftes Szenario: Wenn verschiedene Benutzer die Anfrage lesen, stellen sie fest, dass der Produktbestand ausreichend ist, und initiieren dann gleichzeitig eine Anfrage, um einen Flash-Sale-Vorgang durchzuführen, um den Lagerbestand zu reduzieren, wodurch der Lagerbestand auf einen negativen Wert reduziert wird Nummer.

Die einfachste Methode besteht darin, die Datenbank zu aktualisieren, wenn der Lagerbestand reduziert wird, und Lagerbestandsbeschränkungen zu implementieren. Fügen Sie in der Methode „reducStock(GoodsVo) eine weitere stock_count > 0 hinzu und verwenden Sie Datenbankfunktionen, um Überverkaufsprobleme zu vermeiden.“ es ist immer noch größer als 0, lese stock_count und reduziere es dann um 1. @Update("update miaosha_goods set stock_count=stock_count-1 wheregoods_id=#{goodsId} and stock_count>0")

public void ReduceStock(MiaoshaGoods waren)

7. Was ist der Prozess der Seitenstatik und was ist der Browser-Cache?

Zwischenspeichern Sie die statische HTML-Seite im Client-Browser, und nur ein Teil der Daten wird über die asynchrone Ajax-Aufrufschnittstelle abgerufen, wodurch die Bandbreite reduziert und der Benutzerzugriff beschleunigt wird.

Beim Browser-Caching wird eine Kopie einer angeforderten Webressource (z. B. HTML-Seite, Bild, JS, Daten usw.) im Browser gespeichert. Der Cache speichert eine Kopie des Ausgabeinhalts basierend auf eingehenden Anforderungen. Wenn die nächste Anfrage eintrifft und es sich um dieselbe URL handelt, entscheidet der Cache gemäß dem Caching-Mechanismus, ob die Kopie direkt zur Beantwortung der Zugriffsanfrage verwendet oder die Anfrage erneut an den Quellserver gesendet werden soll. Häufiger ist, dass der Browser die auf der Website besuchten Webseiten zwischenspeichert. Wenn die URL-Adresse erneut besucht wird und die Webseite nicht aktualisiert wurde, wird die Webseite nicht erneut heruntergeladen, sondern lokal Die zwischengespeicherte Webseite wird direkt verwendet. Erst wenn die Website eindeutig erkennt, dass die Ressource aktualisiert wurde, lädt der Browser die Webseite erneut herunter.

8. Flash-Sale-Architektur-Designkonzept?

Verkehrsbegrenzung: Da nur eine kleine Anzahl von Benutzern den sofortigen erfolgreichen Kill beenden kann, muss der größte Teil des Datenverkehrs eingeschränkt werden und nur ein kleiner Teil des Datenverkehrs darf in das Service-Backend gelangen.

Bei der Durchführung einer Flash-Sale-Veranstaltung kommt es zu Beginn des Rush-Sales sofort zu einem Zustrom von Nutzern, was zu einer Spitzenzeit führt. Daher müssen Maßnahmen zur Spitzendämpfung ergriffen werden. Hoher Spitzenverkehr ist ein wichtiger Grund für die Überlastung des Systems. Daher ist es auch eine sehr wichtige Idee bei der Gestaltung eines Flash-Sale-Systems, wie man sofort hohen Verkehr in stabilen Verkehr über einen bestimmten Zeitraum umwandelt. Zu den häufig verwendeten Methoden zur Spitzenbeschneidung gehört der Einsatz von Technologien wie Caching und Nachrichten-Middleware.

Asynchrone Verarbeitung: Das Flash-Sale-System ist ein System mit hoher Parallelität. Durch die Verwendung des asynchronen Verarbeitungsmodus kann die Parallelität des Systems erheblich erhöht werden.

Speichercache: Der größte Engpass des Flash-Sale-Systems ist im Allgemeinen das Lesen und Schreiben von Datenbanken. Da das Lesen und Schreiben von Datenbanken zur Festplatten-E/A gehört, ist die Leistung sehr gering. Die Effizienz wird erheblich verbessert.

Skalierbar: Wenn wir mehr Benutzer und eine größere Parallelität unterstützen möchten, ist es natürlich am besten, das System elastisch und skalierbar zu gestalten. Wenn der Datenverkehr ansteigt, erweitern Sie einfach die Maschine. Bei Double Eleven-Events wie Taobao und JD.com wird eine große Anzahl von Maschinen hinzugefügt, um den Transaktionsspitzenwert zu bewältigen.

9. Designideen für Flash-Sale-Systemarchitekturen?

Anfragen im Upstream des Systems abfangen, um den Downstream-Druck zu reduzieren: Das Flash-Kill-System zeichnet sich durch ein hohes Maß an Parallelität aus, aber die tatsächliche Anzahl erfolgreicher Flash-Kill-Anfragen ist sehr gering, wenn sie also nicht an der Front abgefangen werden Am Ende kommt es wahrscheinlich zu einem Datenbank-Lese-/Schreibsperrenkonflikt und die letzte Anforderung läuft ab.

Cache verwenden: Durch die Verwendung des Caches kann die Lese- und Schreibgeschwindigkeit des Systems erheblich verbessert werden.

Nachrichtenwarteschlange: Die Nachrichtenwarteschlange kann den Spitzenwert reduzieren und eine große Anzahl gleichzeitiger Anforderungen abfangen. Dies ist auch ein asynchroner Verarbeitungsprozess. Das Hintergrundgeschäft ruft basierend auf seinen eigenen Verarbeitungsfähigkeiten aktiv Anforderungsnachrichten aus der Nachrichtenwarteschlange ab.

10. Wenn der Lagerbestand reduziert wird und der Benutzer nicht zahlt, wie kann er den Lagerbestand wiederherstellen und weiterhin am Eilverkauf teilnehmen?

Legen Sie eine maximale Zahlungszeit fest, z. B. 30 Minuten, und es gibt eine geplante Aufgabe im Hintergrund (verwenden Sie einen Timer). Wenn die Rotation 30 Minuten überschreitet, wird die Bestellung bezahlt (der Bestellstatus wird in der Datenbank ermittelt), dann wird die Bestellung geschlossen und der Lagerbestand wiederhergestellt.

Das obige ist der detaillierte Inhalt vonWas sind die Wissenspunkte des Redis-Projekts?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen