Lesen Sie vor dem Vorstellungsgespräch mehr über die Interviewmaterialien des Unternehmens, die für spätere Vorstellungsgespräche sehr hilfreich sein werden. Heute werde ich Ihnen 15 echte Shopee-Server-Interviewfragen mitteilen (mit Antwortanalyse). Ich hoffe, es kann Ihnen helfen.
1. Sortieren Sie die verknüpfte Liste
Wenn Sie den Kopfknoten der verknüpften Liste haben, sortieren Sie ihn bitte in aufsteigender Reihenfolge und geben Sie die sortierte verknüpfte Liste zurück.
Beispiel 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
Nach dem Login kopieren
Beispiel 2:
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
Nach dem Login kopieren
Dieses Problem kann mit Doppelzeigern + Zusammenführungssortierungsalgorithmus gelöst werden. Die wichtigsten vier Schritte sind wie folgt: 1. Schnelle und langsame Zeigermethode, Durchlaufen Sie die verknüpfte Liste, um den mittleren Knoten zu finden
2. Schneiden Sie die verknüpfte Liste am mittleren Knoten ab
3. Ordnen Sie die linken und rechten unterverknüpften Listen mithilfe der Zusammenführungssortierung an
4. Führen Sie die unterverknüpften Listen zusammen
Der vollständige Code lautet wie folgt:
class Solution {
public ListNode sortList(ListNode head) {
//如果链表为空,或者只有一个节点,直接返回即可,不用排序
if (head == null || head.next == null)
return head;
//快慢指针移动,以寻找到中间节点
ListNode slow = head;
ListNode fast = head;
while(fast.next!=null && fast.next.next !=null){
fast = fast.next.next;
slow = slow.next;
}
//找到中间节点,slow节点的next指针,指向mid
ListNode mid = slow.next;
//切断链表
slow.next = null;
//排序左子链表
ListNode left = sortList(head);
//排序左子链表
ListNode right = sortList(mid);
//合并链表
return merge(left,right);
}
public ListNode merge(ListNode left, ListNode right) {
ListNode head = new ListNode(0);
ListNode temp = head;
while (left != null && right != null) {
if (left.val <= right.val) {
temp.next = left;
left = left.next;
} else {
temp.next = right;
right = right.next;
}
temp = temp.next;
}
if (left != null) {
temp.next = left;
} else if (right != null) {
temp.next = right;
}
return head.next;
}
}
Nach dem Login kopieren
2. Der Unterschied zwischen symmetrischen und asymmetrischen Verschlüsselungsalgorithmen
Erste Review-bezogene Konzepte:
Klartext: bezieht sich auf Informationen/Daten, die nicht verschlüsselt wurden.
Chiffretext: Nachdem der Klartext durch den Verschlüsselungsalgorithmus verschlüsselt wurde, wird er zum Chiffretext, um die Datensicherheit zu gewährleisten.
Schlüssel: ist ein Parameter, der in den Algorithmus eingegeben wird, der Klartext in Chiffretext oder Chiffretext in Klartext umwandelt. Schlüssel werden in symmetrische Schlüssel und asymmetrische Schlüssel unterteilt.
Verschlüsselung: Der Prozess der Umwandlung von Klartext in Chiffretext.
Entschlüsselung: Der Prozess der Reduzierung von Chiffretext in Klartext.
Symmetrischer Verschlüsselungsalgorithmus: Ein Verschlüsselungsalgorithmus, der
den gleichen Schlüssel
für die Verschlüsselung und Entschlüsselung verwendet. Zu den gängigen symmetrischen Verschlüsselungsalgorithmen gehören AES, 3DES, DES, RC5, RC6 usw.
Asymmetrischer Verschlüsselungsalgorithmus
: Der asymmetrische Verschlüsselungsalgorithmus erfordert zwei Schlüssel (öffentlicher Schlüssel und privater Schlüssel). Öffentliche Schlüssel und private Schlüssel existieren paarweise. Wenn der öffentliche Schlüssel zum Verschlüsseln von Daten verwendet wird, kann nur der entsprechende private Schlüssel diese entschlüsseln. Die wichtigsten asymmetrischen Verschlüsselungsalgorithmen sind: RSA, Elgamal, DSA, D-H, ECC.
3. Wie TCP Zuverlässigkeit gewährleistet
Zuallererst basiert die TCP-Verbindung auf einem Drei-Wege-Handshake, während die Trennung auf vier Wellen basiert. Sorgen Sie für eine zuverlässige Verbindung und Trennung.
Zweitens spiegelt sich die Zuverlässigkeit von TCP auch in seiner Zustandsbezogenheit wider; TCP zeichnet auf, welche Daten gesendet, welche Daten akzeptiert und welche nicht akzeptiert werden, und stellt sicher, dass die Datenpakete in der richtigen Reihenfolge ankommen, wodurch sichergestellt wird, dass die Datenübertragung erfolgt nicht schiefgehen.
Wieder einmal spiegelt sich die Zuverlässigkeit von TCP auch in seiner Steuerbarkeit wider. Es verfügt über Mechanismen wie Nachrichtenüberprüfung, ACK-Antwort, erneute Übertragung bei Zeitüberschreitung (Sender), erneute Übertragung von Daten außerhalb der Reihenfolge (Empfänger), Verwerfen doppelter Daten, Flusskontrolle (gleitendes Fenster) und Überlastungskontrolle. 4. Lassen Sie uns über die fünf E/A-Modelle sprechen Es hat blockiert und gewartet, bis die Kerneldaten bereit sind und vom Kernel in den Benutzerbereich kopiert wurden, bevor eine Erfolgsmeldung zurückgegeben wird. Dieser E/A-Vorgang wird als blockierende E/A bezeichnet.
4.2 Nicht blockierendes IO-Modell
Wenn die Kerneldaten noch nicht bereit sind, können Sie zunächst eine Fehlermeldung an den Benutzerprozess zurücksenden, sodass dieser nicht warten muss, sondern erneut anfordert durch Umfragen. Dies ist ein nicht blockierendes IO. Das Flussdiagramm sieht wie folgt aus:
4.3 IO-Multiplexing-Modell
Auswahl des IO-Multiplexings
Der Anwendungsprozess kann mehrere Geräte gleichzeitig durch Aufrufen überwachen Die Auswahlfunktion fd, in der von der Auswahlfunktion überwachten FD, solange ein Datenstatus bereit ist, kehrt die Auswahlfunktion in den lesbaren Status zurück, und dann initiiert der Anwendungsprozess eine Recvfrom-Anforderung zum Lesen der Daten. select hat mehrere Nachteile:
Die maximale Anzahl von Verbindungen ist begrenzt, im Allgemeinen 1024 auf Linux-Systemen.
Nachdem die Auswahlfunktion zurückgekehrt ist, durchläuft sie den fdset, um den fertigen Deskriptor fd zu finden.
IO-Multiplexing-Epoll
Um die Probleme von Select zu lösen, wurde das Multiplexing-Modell Epoll geboren. Es wird wie folgt implementiert:
epoll registriert zunächst einen fd (Dateideskriptor) über epoll_ctl(). Sobald ein bestimmter fd bereit ist, aktiviert der Kernel den fd schnell, wenn er epoll_wait() aufruft. Der knifflige Vorgang des Durchlaufens von Dateideskriptoren wird hier entfernt und ein Mechanismus zum Abhören von Ereignisrückrufen wird verwendet. Dies ist das Highlight von Epoll.
4.4 Signalgesteuertes Modell des IO-Modells
Signalgesteuertes IO verwendet keine aktive Abfrage mehr, um zu bestätigen, ob die Daten bereit sind, sondern sendet ein Signal an den Kernel (erstellt beim Aufruf von Sigaction ein SIGIO-Signal). Der Anwendungsbenutzerprozess kann dann andere Dinge tun, ohne ihn zu blockieren. Wenn die Kerneldaten bereit sind, wird der Anwendungsprozess über das SIGIO-Signal benachrichtigt, dass die Daten zur Lesbarkeit bereit sind. Nachdem der Anwendungsbenutzerprozess das Signal empfängt, ruft er sofort recvfrom auf, um die Daten zu lesen. 4.5 IO-Modell asynchrones IO (AIO) „Sofort“ ist nicht das Verarbeitungsergebnis, sondern bedeutet, dass die Übermittlung erfolgreich war. Wenn die Kerneldaten bereit sind, kopieren Sie die Daten in den Benutzerprozesspuffer und senden Sie ein Signal, um den Benutzerprozess darüber zu informieren, dass der E/A-Vorgang abgeschlossen ist.
Der Prozess ist wie folgt:
5. Hystrix-Arbeitsprinzip:
1. Build-BefehlHystrix stellt zwei Befehlsobjekte bereit: HystrixCommand und HystrixObserv fähiger Befehl , wird es im Namen einer Ihrer Abhängigkeitsanforderungsaufgaben die zum Anfordern von Abhängigkeiten erforderlichen Parameter an den Konstruktor übergeben.
2. Befehle ausführen
Es gibt vier Möglichkeiten, Hystrix-Befehle auszuführen. Dies sind:
Rexecute(): synchrone Blockierungsausführung, Empfang einer einzelnen Antwort von der abhängigen Anforderung.
Future queue(): Asynchrone Ausführung, gibt ein Future-Objekt zurück, das eine einzelne Antwort enthält. Observable observable(): Nach dem Erstellen eines Observables abonniert es das Observable und gibt das Observable-Objekt zurück, das die Antwort der abhängigen Anfrage darstellt. Observable toObservable(): Observable kalt stellen, ein Observable zurückgeben und Der Hystrix-Befehl wird nur beim Abonnieren ausgeführt. Es können mehrere Ergebnisse zurückgegeben werden bevor die Aufgabe ausgeführt wird. Wenn dies der Fall ist, wird das Observable, das die zwischengespeicherte Antwort enthält, direkt zurückgegeben. Wenn kein zwischengespeichertes Ergebnis vorhanden ist, die Zwischenspeicherung jedoch aktiviert ist, wird das Ausführungsergebnis für die spätere Verwendung zwischengespeichert.
4. Überprüfen Sie, ob der Leistungsschalter (Leistungsschalter) geöffnet ist. Eine Sicherung brennt aus, um den Stromkreis zu schützen, wenn eine Gefahr auftritt, während ein Leistungsschalter einen Kurzschluss auslösen kann Es erreicht den von uns festgelegten Schwellenwert (z. B. Die Anforderungsfehlerrate erreicht 50 %) und weigert sich, eine Anforderung auszuführen. Wenn der Looper geöffnet ist, führt Hystrix den Befehl nicht aus und wechselt direkt in die Fallback-Verarbeitungslogik.
5. Überprüfen Sie den Thread-Pool-/Semaphor-/Warteschlangenstatus. Zu den Hystrix-Isolationsmethoden gehören die Thread-Pool-Isolation und die Semaphor-Isolation. Bei Verwendung des Hystrix-Thread-Pools weist Hystrix standardmäßig jedem abhängigen Dienst 10 Threads zu. Wenn alle 10 Threads ausgelastet sind, wird die Ausführung des Befehls abgelehnt und stattdessen sofort zur Ausführung der Fallback-Logik übergegangen. 6. Verwenden Sie HystrixObservableCommand.construct() oder HystrixCommand.run(), um die eigentlichen Aufgaben des Benutzers auszuführen.
7. Berechnen Sie den Zustand der Schleife. Jedes Mal, wenn die Ausführung eines Befehls beginnt oder eine Ausnahme auftritt, wird der Ausführungsstatus aufgezeichnet, z. B.: Erfolg, Fehler, Ablehnung, Zeitüberschreitung und andere Indikatoren Die Daten werden regelmäßig verarbeitet und dann basierend auf den festgelegten Bedingungen bestimmt, ob der Looper geöffnet werden soll. 8. Führen Sie die Fallback-Logik aus, wenn der Befehl fehlschlägt. In der obigen Abbildung werden Schaltkreisunterbrechung, Thread-Pool-Ablehnung, Semaphor-Ablehnung, Ausführungsausführung und Ausführungszeitüberschreitung alle in die Fallback-Verarbeitung einbezogen.
9. Das ursprüngliche Objektergebnis wird in Form von Observable zurückgegeben. Bevor es an den Benutzer zurückgegeben wird, erfolgt je nach aufrufender Methode eine gewisse Verarbeitung.
6. Verzögerungsszenarioverarbeitung
In der täglichen Entwicklung stoßen wir häufig auf diese Art von Geschäftsszenario, wie zum Beispiel: Wenn eine Bestellung zum Mitnehmen länger als 30 Minuten nicht bezahlt wird, wird die Bestellung 15 Minuten später automatisch storniert Wenn sich der Benutzer erfolgreich registriert, wird eine Textnachricht gesendet. Benutzer benachrichtigen und mehr. Dies ist das Szenario mit verzögerter Aufgabenverarbeitung. Wir haben hauptsächlich die folgenden Lösungen für solche Szenarien: JDKs DelayQueue-Verzögerungswarteschlange Zeitradalgorithmus Datenbank-geplante Aufgaben (z. B. Quartz) Redis ZSet-Implementierung
MQ-Verzögerung Warteschlangenimplementierung
7.https-Anfrageprozess
HTTPS = HTTP + SSL/TLS, d. h. SSL/TLS zum Verschlüsseln und Entschlüsseln der Daten und HTTP für die Übertragung verwenden.
SSL oder Secure Sockets Layer ist ein Sicherheitsprotokoll, das Sicherheit und Datenintegrität für die Netzwerkkommunikation bietet.
TLS, Transport Layer Security (Secure Transport Layer Protocol), ist die Nachfolgeversion von SSL 3.0.
http-Anfrageprozess
1 Der Benutzer gibt eine https-URL in den Browser ein und stellt dann eine Verbindung zum 443-Port des Servers her.
2. Der Server muss über einen Satz digitaler Zertifikate verfügen. Sie können diese selbst erstellen oder bei der Organisation beantragen. Der Unterschied besteht darin, dass das von Ihnen ausgestellte Zertifikat vom Kunden überprüft werden muss. Bei diesem Zertifikatssatz handelt es sich eigentlich um ein Paar öffentlicher und privater Schlüssel.
3. Der Server sendet sein eigenes digitales Zertifikat (mit öffentlichem Schlüssel) an den Client.
4. Nachdem der Client das digitale Zertifikat vom Server erhalten hat, wird es überprüft. Wenn dies fehlschlägt, wird ein Warnfeld angezeigt. Wenn das Zertifikat in Ordnung ist, wird ein Schlüssel generiert (symmetrische Verschlüsselung) und mit dem öffentlichen Schlüssel des Zertifikats verschlüsselt.
5. Der Client initiiert die zweite HTTP-Anfrage in HTTPS und sendet den verschlüsselten Client-Schlüssel an den Server.
6. Nachdem der Server den Chiffretext vom Client erhalten hat, verwendet er seinen eigenen privaten Schlüssel, um ihn asymmetrisch zu entschlüsseln, und verwendet dann den Client-Schlüssel, um die zurückgegebenen Daten symmetrisch zu verschlüsseln Auf diese Weise werden die Daten zu Chiffretext.
7. Der Server gibt den verschlüsselten Chiffretext an den Client zurück.
8. Der Client empfängt den vom Server zurückgegebenen Chiffretext, verwendet seinen eigenen Schlüssel (Client-Schlüssel), um ihn symmetrisch zu entschlüsseln, und erhält die vom Server zurückgegebenen Daten.
8. Lassen Sie uns über die Transaktionsisolationsstufe und das Implementierungsprinzip des wiederholbaren Lesens sprechen. 8.1 Die vier Isolationsstufen der Datenbank Lesen, Phantomlesen usw., die in gleichzeitigen Transaktionen vorhanden sind. Frage: Der Datenbankonkel hat vier Isolationsstufen entworfen. Sie sind „nicht festgeschrieben lesen“, „festgeschrieben lesen“, „wiederholbar lesen“ und „serialisierbar“.
Nicht festgeschriebene Isolationsstufe lesen: Es ist nur eingeschränkt, dass zwei Daten nicht gleichzeitig geändert werden können. Wenn die Transaktion jedoch nicht übermittelt wird, können sie von anderen Transaktionen gelesen werden Transaktionsisolation ist schmutzig. Probleme beim Lesen, beim wiederholten Lesen und beim Phantomlesen Es gibt immer noch Probleme mit wiederholtem Lesen und Phantomlesen.
Wiederholbares Lesen: Es schränkt die Änderung beim Lesen von Daten ein, sodass das Problem des wiederholten Lesens gelöst wird. Beim Lesen von Bereichsdaten können jedoch Daten eingefügt werden Es wird auch Phantomlesen geben Probleme;
Serialisierung: die höchste Isolationsstufe für Transaktionen. Auf dieser Stufe werden alle Transaktionen seriell und sequentiell ausgeführt. Es kann alle Parallelitätsprobleme von Dirty Reads, nicht wiederholbaren Lesevorgängen und Phantom Reads vermeiden. Unter dieser Transaktionsisolationsstufe ist die Transaktionsausführung jedoch sehr leistungsintensiv.
Was sind die Parallelitätsprobleme zwischen den vier Isolationsstufen?
Isolationsstufe
Dirty Read
Non-repeatable Read
Phantom Read
Read Uncommitted
√
√
√
lesen Senden
×
√
√
Wiederholbares Lesen
×
×
√
Serialisierung
×
×
×
8.2 Sichtbarkeitsregeln für Leseansichten eine Liste.
max_limit_id
gibt den ID-Wert an, der der nächsten Transaktion im System zugewiesen werden soll, wenn eine Leseansicht generiert wird.
min_limit_id
stellt die kleinste Transaktions-ID unter den aktiven Lese- und Schreibtransaktionen im aktuellen System beim Generieren der Leseansicht dar, also den kleinsten Wert in m_ids.
creator_trx_id
Erstellen Sie die Transaktions-ID der aktuellen Leseansicht
Die Sichtbarkeitsregeln der Leseansicht lauten wie folgt:
Wenn die Datentransaktions-ID trx_id < min_limit_id ist, bedeutet dies, dass die Transaktion, die diese Version generiert hat, vor der Generierung von Read übermittelt wurde Ansicht (Da die Transaktions-ID inkrementiert wird), kann die aktuelle Transaktion auf diese Version zugreifen. trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
Wenn trx_id>= max_limit_id, bedeutet dies, dass die Transaktion, die diese Version generiert hat, nach der Generierung von Read View generiert wurde, sodass auf diese Version nicht zugegriffen werden kann die aktuelle Transaktion.
Wenn min_limit_id =<trx_id< max_limit_id, muss es in drei Situationen besprochen werden
1) Wenn m_ids< /code>enthält <code>trx_id, der den Zeitpunkt darstellt, zu dem Read View generiert wird. Diese Transaktion wurde noch nicht übermittelt, aber wenn der trx_id</code > der Daten ist gleich <code>creator_trx_id gibt an, dass die Daten von sich selbst generiert werden und daher sichtbar sind.
2) Wenn m_idstrx_id enthält und trx_id nicht gleich creator_trx_id ist, dann Read Ansicht< Wenn /code> generiert wird, wird die Transaktion nicht übermittelt und nicht von selbst erstellt, daher ist die aktuelle Transaktion unsichtbar </p><p>3) Wenn <code>m_ids nicht trx_id</ enthält; code>, dann bedeutet dies, dass Ihre Transaktion übermittelt wurde, bevor <code>Read View generiert wurde, und das Ergebnis der Änderung in der aktuellen Transaktion sichtbar ist.
8.3 Prinzip der wiederholbaren Leseimplementierung
🎜Die Datenbank erreicht Isolationsstufen durch Sperren, zum Beispiel wenn Sie Wenn Sie allein sein und nicht von anderen gestört werden möchten, können Sie sich im Haus einschließen und ein Schloss an der Tür anbringen! Die Serialisierungsisolationsstufe wird durch Sperren implementiert. Wenn Sie jedoch häufig sperren, nimmt die Leistung ab. Also dachte der Onkel, der die Datenbank entworfen hat, an MVCC. 🎜🎜Das Implementierungsprinzip des wiederholbaren Lesens ist MVCC-Parallelitätskontrolle für mehrere Versionen. Im Rahmen einer Transaktion lesen zwei identische Abfragen denselben Datensatz, geben jedoch unterschiedliche Daten zurück. Dies ist ein nicht wiederholbarer Lesevorgang. Die Isolationsstufe für wiederholbare Lesevorgänge soll das Problem des nicht wiederholbaren Lesevorgangs lösen. 🎜🎜Wie erfolgt die Abfrage eines Datensatzes basierend auf MVCC? 🎜🎜🎜🎜Rufen Sie die Versionsnummer der Transaktion ab, also die Transaktions-ID🎜🎜🎜Rufen Sie die aus der Leseansicht🎜🎜🎜-Abfrage erhaltenen Daten ab und vergleichen Sie dann die Transaktionsversionsnummern die Leseansicht. 🎜🎜🎜Wenn die Sichtbarkeitsregeln der Leseansicht nicht erfüllt sind, ist der historische Schnappschuss im Rückgängig-Protokoll erforderlich;🎜🎜🎜Endlich die Daten zurückgeben, die den Regeln entsprechen🎜🎜InnoDB MVCC wird durch Read View+ Undo Log implementiert, speichert historische Snapshots und ist für Read View</code sichtbar > Sexuelle Regeln helfen dabei, festzustellen, ob die aktuelle Version der Daten sichtbar ist. 🎜🎜Wie löst die Isolationsstufe „Repeatable Read“ (RR) das Problem des nicht wiederholbaren Lesens? 🎜🎜Angenommen, es gibt Transaktionen A und B, der SQL-Ausführungsprozess ist wie folgt🎜🎜<img src="https://img.php.cn/upload/image/350/448/491/16454137204380815 echte Shopee-Server-Interviewfragen, können Sie sie alle richtig beantworten? (mit Analyse)" title= "16454137204380815 echte Shopee-Server-Interviewfragen, können Sie sie alle richtig beantworten? (mit Analyse) " alt="115 echte Shopee-Server-Interviewfragen, können Sie sie alle richtig beantworten? (mit Analyse)"/>🎜🎜Unter der Isolationsstufe „Repeatable Read“ (RR) wird eine <code>Leseansicht nur einmal in einer Transaktion abgerufen, die von geteilt wird Replikate, wodurch sichergestellt wird, dass alle abgefragten Daten gleich sind. 🎜🎜Angenommen, es gibt derzeit eine core_user-Tabelle und fügen Sie Initialisierungsdaten wie folgt ein: 🎜🎜🎜🎜🎜Basierend auf MVCC werfen wir einen Blick auf den Ausführungsprozess 🎜🎜1 A startet eine Transaktion und erhält zunächst eine Transaktions-ID von 100 🎜🎜2. B Öffnen Sie die Transaktion und erhalten Sie die Transaktions-ID als 101🎜🎜3. Der entsprechende Wert der Leseansicht lautet wie folgt:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn