Rookie Network Java-Praktikumserfahrung

Stellen Sie sich und die von Ihnen durchgeführten Projekte vor

Barabara

Sie verwenden Redis in Ihrem Projekt. Können Sie erklären, warum Sie es verwenden?

Basierend auf Speicheroperationen ist die Lese- und Schreibgeschwindigkeit im Speicher hoch.

Unterstützt mehrere Datentypen, einschließlich String, Hash, List, Set, ZSet usw.

Unterstützen Sie die Ausdauer. Redis unterstützt zwei Persistenzmechanismen, RDB und AOF. Die Persistenzfunktion kann Datenverlustprobleme effektiv vermeiden.

Unterstützen Sie Transaktionen. Alle Operationen von Redis sind atomar, und Redis unterstützt auch die atomare Ausführung nach dem Zusammenführen mehrerer Operationen.

Unterstützt die Master-Slave-Replikation. Der Master-Knoten synchronisiert die Daten automatisch mit dem Slave-Knoten und ermöglicht so eine Lese- und Schreibtrennung.

Die Verarbeitung von Redis-Befehlen erfolgt Single-Threaded. Redis 6.0 führt Multithreading ein. Es ist zu beachten, dass Multithreading zum Lesen und Schreiben von Netzwerkdaten und zur Protokollanalyse verwendet wird und die Ausführung von Redis-Befehlen immer noch Single-Threading ist.

Warum Redis eine gute Leistung hat
  • Basierend auf der Erinnerung:

Redis nutzt Arbeitsspeicher und hat keinen Festplatten-IO-Overhead. Die Daten werden im Speicher abgelegt und die Lese- und Schreibgeschwindigkeit ist hoch.

  • IO-Multiplexing-Modell:

Redis verwendet IO-Multiplexing-Technologie.

E/A: Netzwerk-E/A; Mehrkanal: mehrere TCP-Verbindungen; Multiplexing: gemeinsame Nutzung eines Threads oder Prozesses.

Für den Einsatz in einer Produktionsumgebung stellen normalerweise mehrere Clients eine Verbindung zu Redis her und senden dann jeweils Befehle an den Redis-Server. Schließlich verarbeitet der Server diese Anfragen und gibt die Ergebnisse zurück. Um eine große Anzahl von Anfragen zu bewältigen, verwendet Redis einen I/O-Multiplexer, um mehrere Sockets gleichzeitig abzuhören, diese Ereignisse in eine Warteschlange zu verschieben und sie dann einzeln auszuführen. Abschließend werden die Ergebnisse an den Kunden zurückgegeben.

  • einzelner Thread

Redis ist Single-Threaded und vermeidet Kontextwechsel

  • Effiziente Datenstrukturen:

Die unterste Ebene jedes Datentyps in Redis wurde optimiert, mit effizienter Datenstruktur und angemessener Codierung.

alt

Wie Redis verteilte Aufgaben verarbeitet
1. Master-Slave-Modus (Lese-Schreib-Trennung)

Obwohl der Redis-Einzelknoten Daten über RDB- und AOF-Persistenzmechanismen auf der Festplatte speichern kann, werden die Daten auf einem Server gespeichert. Wenn auf dem Server Probleme wie ein Festplattenausfall auftreten, sind die Daten nicht verfügbar und das Lesen und Schreiben ist nicht möglich . Trennung, Lesen und Schreiben erfolgen alle auf demselben Server, und es kommt zu E/A-Engpässen, wenn die Anzahl der Anforderungen groß ist.

Um Single Points of Failure und die Nichttrennung von Lesen und Schreiben zu vermeiden, bietet Redis eine Replikationsfunktion, um die aktualisierten Daten automatisch mit anderen Slave-Datenbanken zu synchronisieren, nachdem die Daten in der Master-Datenbank aktualisiert wurden.

2. Sentry-Modus

Der Kern des Sentinel-Modus ist immer noch die Master-Slave-Replikation, aber im Vergleich zum Master-Slave-Modus gibt es einen zusätzlichen Wahlmechanismus, wenn der Master-Knoten ausfällt und nicht mehr beschreibbar ist: Ein neuer Master-Knoten wird aus allen Slave-Knoten ausgewählt. Die Implementierung des Wahlmechanismus beruht auf dem Starten eines Sentinel-Prozesses im System.

alt

Der Sentry selbst kann jedoch auch auf das Problem eines Single Point of Failure stoßen, sodass in einem Redis-System mit einem Master und mehreren Slaves mehrere Sentrys zur Überwachung verwendet werden können. Die Sentrys überwachen nicht nur die Master-Datenbank und die Slave-Datenbanken, sondern auch überwachen uns auch gegenseitig. .

3. Redis-Cluster-Lösung (Cluster-Modus)

Cluster nimmt eine zentrumslose Struktur an und seine Eigenschaften sind wie folgt:

Alle Redis-Knoten sind miteinander verbunden (PING-PONG-Mechanismus) und intern wird ein Binärprotokoll verwendet, um Übertragungsgeschwindigkeit und Bandbreite zu optimieren.

Der Ausfall eines Knotens wird erst dann wirksam, wenn mehr als die Hälfte der Knoten im Cluster einen Ausfall erkennen.

Der Client ist direkt mit dem Redis-Knoten verbunden, ohne dass eine Zwischen-Proxy-Schicht erforderlich ist. Der Client muss nicht mit allen Knoten im Cluster verbunden sein, sondern kann sich lediglich mit jedem verfügbaren Knoten im Cluster verbinden

Der spezifische Arbeitsmechanismus des Cluster-Modus:

Auf jedem Knoten von Redis gibt es einen Slot mit einem Wertebereich von 0-16383

Wenn wir auf den Schlüssel zugreifen, erhält Redis ein Ergebnis basierend auf dem CRC16-Algorithmus und berechnet dann den Rest des Ergebnisses zu 16384, sodass jeder Schlüssel einem Hash-Slot mit einer Nummer zwischen 0 und 16383 entspricht. Finden Sie anhand dieses Werts den Knoten, der dem entsprechenden Steckplatz entspricht, und springen dann automatisch direkt zum entsprechenden Knoten, um Zugriffsvorgänge durchzuführen.

Um eine hohe Verfügbarkeit sicherzustellen, führt der Cluster-Modus auch den Master-Slave-Replikationsmodus ein. Ein Master-Knoten entspricht einem oder mehreren Slave-Knoten. Wenn der Master-Knoten ausfällt, werden die Slave-Knoten aktiviert.

Wenn andere Master-Knoten einen Master-Knoten A anpingen und die Kommunikation zwischen mehr als der Hälfte der Master-Knoten und A abbricht, gilt der Master-Knoten A als ausgefallen. Wenn Master-Knoten A und seine Slave-Knoten ausfallen, kann der Cluster keine Dienste mehr bereitstellen.

Der Cluster-Knoten im Cluster-Modus ist mit mindestens 6 Knoten konfiguriert (3 Master und 3 Slaves, da mehr als die Hälfte benötigt wird). Der Master-Knoten stellt Lese- und Schreibvorgänge bereit, der Slave-Knoten dient jedoch nicht als Backup-Knoten stellt Anfragen bereit und wird nur für Failover verwendet.

Wie Redis eine Warteschlange und einen Stapel implementiert
Stapel

Verwenden Sie LPUSH, um einen Schlüssel mit dem Namen „Stack“ zu erstellen und die Elemente einzufügen, verwenden Sie LRANGE, um die Put-Elemente anzuzeigen, und verwenden Sie LPOP, um die Put-Elemente herauszunehmen. Sie können feststellen, dass die Reihenfolge des Herausnehmens der Reihenfolge des Einfügens entgegengesetzt ist rein (zuerst rein, zuletzt raus)

LPUSH stack q w e r t y u i o p  
LRANGE stack 0 -1 
LPOP stack  
Warteschlange
LPUSH queue q w e r t y u i o p  
LRANGE queue 0 -1  
RPOP queue  
Welche Arten von Redis gibt es? Können Sie sie vorstellen?

Redis unterstützt fünf Kerndatentypen, nämlich Zeichenfolgen, Hashes, Listen, Mengen und geordnete Mengen.

Redis bietet auch die Typen Bitmap, HyperLogLog und Geo, diese Typen werden jedoch basierend auf den oben genannten Kerndatentypen implementiert.

Redis hat in 5.0 den Datentyp Streams hinzugefügt, eine leistungsstarke Nachrichtenwarteschlange, die Multicast unterstützt und langlebig ist.

Könnten Sie bitte vorstellen, wie ES die Datensynchronisierung erreicht, da in Ihrem Projekt Elasticsearch verwendet wird?
Synchrones Doppelschreiben

Dies ist eine relativ einfache Methode: Wenn Sie Daten in MySQL schreiben, schreiben Sie die Daten gleichzeitig in ES, um ein doppeltes Schreiben von Daten zu erreichen.

Asynchrones Doppelschreiben (MQ-Modus)

Um die Leistungs- und Datenverlustprobleme des ersten synchronen Dual-Write zu beheben, können Sie die Einführung von MQ in Betracht ziehen, um eine asynchrone Dual-Write-Lösung zu schaffen.

Da die Leistung von MQ grundsätzlich um eine Größenordnung höher ist als die von MySQL, kann die Leistung erheblich verbessert werden.

Asynchrones Doppelschreiben (Worker-Modus)

Bei den oben genannten Lösungen gibt es Probleme mit der Hartcodierung, das heißt, der ES-Code wird überall dort eingefügt, wo mysq hinzugefügt, gelöscht, geändert und überprüft wird. Der Code ist zu aufdringlich.

Wenn die Echtzeitanforderungen nicht hoch sind, können Sie die Verwendung eines Timers wie der Logstash-Verarbeitung in Betracht ziehen. Die spezifischen Schritte lauten wie folgt:

Fügen Sie der entsprechenden Tabelle der Datenbank ein Feld mit Zeitstempel hinzu. Jede CRUD-Operation führt dazu, dass sich die Zeit dieses Felds ändert.

Die CURD-Operation im Originalprogramm nimmt keine Änderungen vor; ein Timerprogramm wird hinzugefügt, das es dem Programm ermöglicht, die angegebene Tabelle gemäß einem bestimmten Zeitraum zu scannen, die Daten, die sich innerhalb des Zeitraums geändert haben, zu extrahieren und in die zu schreiben ES eins nach dem anderen.

Notiz:

Logstash ist eine kostenlose und offene serverseitige Datenverarbeitungspipeline, die Daten aus mehreren Quellen aufnimmt, umwandelt und an Ihr bevorzugtes „Repository“ sendet.

Binlog-Synchronisationsmethode:

Die oben genannten Lösungen weisen entweder Codeeinbrüche, harte Codierung oder Verzögerungen auf. Bei der vierten Lösung können Sie das Plug-in go-mysql-elasticsearch verwenden, um verwandte Funktionen zu implementieren. Es verwendet das Binlog von MySQL zur Synchronisierung.

Konkrete Schritte sind wie folgt:

1) Lesen Sie das Binlog-Protokoll von MySQL und erhalten Sie die Protokollinformationen der angegebenen Tabelle.

2) Konvertieren Sie die gelesenen Informationen in MQ;

3) Schreiben Sie ein MQ-Verbraucherprogramm.

4) Verbrauchen Sie weiterhin MQ und schreiben Sie die Nachricht nach dem Verbrauch jeder Nachricht an ES.

Lassen Sie uns über Auswahlsortierung und Blasensortierung sprechen
Blasensortierung

Vergleichen Sie beginnend mit der ersten Zahl die beiden benachbarten Zahlen der Reihe nach. Wenn die vorherige Zahl größer als die folgende Zahl ist, vertauschen Sie die Positionen der beiden Zahlen. Wenn die vorherige Zahl kleiner oder die beiden gleich groß sind, wird dies nicht der Fall sein wird verarbeitet.

Auswahl sortieren

Die Auswahlsortiermethode besteht darin, das kleinste oder größte Element aus den zu sortierenden Datenelementen auszuwählen und es mit dem Element an der ersten Position auszutauschen.

Schreiben wir ein Stück SQL: Es gibt eine Tabelle mit drei Typen: ID, Name und Typ. Wählen Sie die Daten mit der größten ID in jedem Typ aus.

Angenommen, diese Tabelle heißt data_table

SELECT type, MAX(id) AS max_id 
FROM data_table 
GROUP BY type;

추천

출처blog.csdn.net/qq_51118755/article/details/135307919