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.
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]
Beispiel 2:
输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
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; } }
2. Der Unterschied zwischen symmetrischen und asymmetrischen Verschlüsselungsalgorithmen
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ährleistetWenn 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
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.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.
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.
Isolationsstufe | Dirty Read | Non-repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
lesen Senden | × | √ | √ |
Wiederholbares Lesen | × | × | √ |
Serialisierung | × | × | × |
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. |
---|---|
Erstellen Sie die Transaktions-ID der aktuellen Leseansicht |
Variabler Wert | |
---|---|
100, 101 | |
102 | |
100 | |
100 |
Variabler Wert | |
---|---|
100, 101 | |
102 | |
100 | |
100 |