Heim  >  Artikel  >  Backend-Entwicklung  >  Teilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten)

Teilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten)

青灯夜游
青灯夜游nach vorne
2022-03-03 13:20:1636236Durchsuche

Dieser Artikel stellt 28 PHP-Interviewfragen (mit Antworten) zusammen, um Ihnen beim Sortieren des Grundwissens zu helfen. Ich hoffe, dass er für alle hilfreich ist.

Teilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten)

Verwandte Empfehlungen: Sammlung von PHP-Interviewfragen im Jahr 2023 (Sammlung)

Nach dem neuen Jahr habe ich festgestellt, dass ich viele grundlegende Fragen nicht verstanden und studiert habe Ich habe die Fragen im Vorstellungsgespräch vorher gründlich genug gestellt, um mich zu ermutigen, weiterzumachen und sie in Foren und Suchmaschinen zusammenzufassen. Einige der Fragen sind Fragen oder Antworten, die von Senioren im Forum geteilt werden Fragen, auf die ich in den letzten Interviews gestoßen bin, habe ich auf der Grundlage meiner eigenen Erkenntnisse und der Aussagen von Senioren archiviert, sodass ich sie in der Hoffnung weitergebe, dass sie anderen Freunden hilfreich sein werden. Ich hoffe auch, Rat von den Großen zu erhalten Zu den Missverständnissen werde ich in naher Zukunft weiter aktualisieren

hashtable: Zuordnung verschiedener Schlüsselwörter (Schlüssel) Die Funktion berechnet den Hash-Wert (Bucket->h) und indiziert direkt den entsprechenden Bucket. Die

hash-Tabelle speichert den Zeiger der aktuellen Schleife, sodass foreach schneller ist als für

  • Bucket: Speichert den Schlüssel und die Summe des Array-Elementwerts und den Hash-Wert h

  • 2. So stellen Sie Ordnung sicher
  • 1. Fügen Sie eine Zuordnungstabelle mit derselben Größe hinzu als Speicherelement-Array zwischen der Hash-Funktion und dem Element-Array (Bucket).

2. Wird zum Speichern der Indizes von Elementen im tatsächlichen Speicherarray verwendet

  • 3. Elemente werden in der Reihenfolge der Zuordnungstabelle in das tatsächliche Speicherarray eingefügt

  • 4. Die Zuordnungstabelle ist einfach Tatsächlich gibt es keine tatsächliche Zuordnungstabelle. Wenn der Bucket-Speicher während der Initialisierung zugewiesen wird, wird auch die gleiche Menge an uint32_t-Speicherplatz zugewiesen, und dann wird arData an den Ort verschoben, an dem sich das Elementarray befindet gelagert.

  • 3. Hash-Duplikation lösen (von PHP verwendete Methode der verknüpften Liste):
  • 1. Methode der verknüpften Liste: Wenn verschiedene Schlüsselwörter auf dieselbe Einheit verweisen, verwenden Sie eine verknüpfte Liste, um das Schlüsselwort zu speichern (durchqueren Sie die verknüpfte Liste entsprechend dem Schlüssel)

2. Offene Adressierungsmethode: Wenn das Schlüsselwort auf eine Einheit verweist, für die bereits Daten vorhanden sind, suchen Sie weiter nach anderen Einheiten, bis eine verfügbare Einheit gefunden wird (die andere Einheitenpositionen belegt, ist mehr). wahrscheinlich Hash-Konflikte und Leistungseinbußen)

  • 4. Grundkenntnisse
  • verknüpfte Liste: Warteschlange, Stapel, doppelt verknüpfte Liste,

verknüpfte Liste: Element + Zeiger, der auf das nächste Element zeigt

  • doppelt verknüpfte Liste: Zeiger zeigt auf das vorherige Element + Element + zeigt nach unten. Ein-Element-Zeiger

  • Referenz:
  • Ein Artikel über die zeitliche und räumliche Komplexität des Algorithmus


2. Die zeitliche und räumliche Komplexität der Blasensortierung

1, Code-Implementierung

         $arr = [2, 4, 1, 5, 3, 6];
         for ($i = 0; $i < (count($arr)); $i++) {
             for ($j = $i + 1; $j < (count($arr)); $j++) {
                 if ($arr[$i] <= $arr[$j]) {
                     $temp = $arr[$i];
                     $arr[$i] = $arr[$j];
                     $arr[$j] = $temp;
                 }
             }
         }
     result : [6,5,4,3,2,1]

2. Berechnungsprinzip

Erste Runde: Vergleichen Sie das erste Element des Arrays mit allen anderen Elementen Element größer ist, ändern Sie die Reihenfolge und blasen Sie dann das erste Element auf

Erste Runde: Vergleichen Sie das zweite Element des Arrays mit allen anderen Elementen (das erste größte Element wurde herausgefiltert und Nr Sie müssen mit dem Vergleichen fortfahren), welches Element auch immer größer ist, ändern Sie die Reihenfolge, wodurch das zweitgrößte Element heraussprudelt

  • ... und so weiter, wobei das Array von groß nach klein sortiert wird

  • Durchschnittliche Zeitkomplexität: O(n^2) ;

  • Optimale Zeitkomplexität: O(n) , muss eine Entscheidung treffen. Wenn es in der ersten Schleife keinen Austausch gibt, springe aus die Schleife direkt
  • Raumkomplexität: O( 1), der von temporären Variablen beim Austausch von Elementen belegte Platz

  • Optimale Raumkomplexität: O(1), sortiert, nein müssen Positionen austauschen durch den Algorithmus, da die Leistung verschiedener Maschinen inkonsistent ist, nur eine allgemeine Methode zur Effizienzberechnung)

Darstellungsmethode: Big-O-Notation O(n^2)

     最优时间复杂度:O(n) ,需要加判断,第一次循环如果一次都没有交换就直接跳出循环

     空间复杂度:O(1),交换元素的时候的临时变量占用的空间

     最优空间复杂度:O(1)

Komplexitätsgrad:

Konstante Ordnung O(1)

  • Lineare Ordnung O(n)

  • Quadratische Ordnung O(n²)

  • Kubische Ordnung O(n³)

  • K-te Ordnung O(n^k)

  • Exponentielle Ordnung ( 2^ n)

  • Logarithmische Ordnung O(logN)

  • Lineare logarithmische Ordnung O(nlogN)

  • Zeitreplikationstyp:

    • Beste Zeitkomplexität

    • Schlechteste Zeitkomplexität

    • Durchschnitt Zeitkomplexität

    • Amortisierte Zeitkomplexität

    Raumkomplexität: Vollständige asymptotische Raumkomplexität, Schätzung der Nutzung des Computerspeichers (Beschreibung des Trends des vom Algorithmus belegten Speicherplatzes, nicht des tatsächlich belegten Speicherplatzes, das gleiche wie oben)

    Referenz:

    Ein Artikel über die zeitliche und räumliche Komplexität des Algorithmus

    3. Netzwerk-Siebenschichtprotokoll und TCP und TCP

    Anwendungsschicht, Präsentationsschicht, Sitzungsschicht, Transport Schicht, Netzwerkschicht, (Daten-) Verbindungsschicht, physikalische Schicht

    Speicherroutine:

    Erstes Wort: Tabelle-zu-Tabelle-Übertragung (Thing-Chain-Netzwerk)

    Erstes Wort: Anwendungsschicht (Anzahl der Vorkommen (mehr, einfach zu Denken Sie daran)

    Die ersten vier Vorwärtsrichtungen: sollten ausgedrückt werden – werden übertragen

    Die letzten drei Rückwärtsrichtungen: Die Homophonie des Internets der Dinge ist leichter zu merken als das Internet der Dinge

    4. Eigenschaften und Unterschiede zwischen TCP und UDP

    1. Sie sind alle Transportschichtprotokolle

    2. TCP

    • ist verbindungsorientiert und kann daher nur eins-zu-eins

    • orientiert sein Übertragung

    • Daten sind zuverlässig und gehen nicht verloren

    • Vollduplex-Kommunikation

    3. UDP (umgekehrt gemäß TCP-Eigenschaften)

    • Keine Verbindung, unterstützt Eins-zu-Eins , eins-zu-viele, viele-zu-viele

    • Orientiert an der Wärmeerhaltungsübertragung

    • Der Header-Overhead ist gering, die Daten sind nicht unbedingt zuverlässig, aber die Geschwindigkeit ist schneller

    5. TCPs Drei-Wege-Handshake und Vier-Wege-Welle

    1. Drei-Wege-Handshake:

    • 1) Zum ersten Mal: ​​Client sendet SYN = 1, seq = client_isn

      Funktion:

      Client: Keine

      Server: Bestätigen Sie seine eigene Empfangsfunktion und die Sendefunktion des Clients

    • 2) Zweites Mal: ​​Server sendet SYN = 1. SEQ = Server_ISN, ACK = Client_isn +1

      :

    • Client: Bestätigen, dass dies der Fall ist Normal zum Senden und Empfangen, bestätigen Sie, dass der Empfang und das Senden des Servers normal sind (zu diesem Zeitpunkt kann der Server nicht bestätigen, ob der Client-Empfang normal ist)
    • 3) Das dritte Mal: ​​Der Client sendet SYN = 0, ACK = server_isn+1,seq =client_isn+1

    • Funktion: Beide Parteien bestätigen sich gegenseitig Der Empfang und die Übertragung sind normal, die Verbindung ist hergestellt

    2. Viermal winken
    • 1) Das erste Mal: ​​Der Client sendet FIN

    • Funktion: Teilen Sie dem Server mit, dass ich keine Daten zum Senden habe (aber es können trotzdem Daten empfangen werden)
    • 2) Zweites Mal: ​​Der Server sendet ACK

    • Funktion: Sagt dem Der Client gibt an, dass die Anfrage empfangen wurde. Der Server muss möglicherweise noch Daten senden. Daher wechselt der Client nach dem Empfang in den Status FIN_WAIT und wartet auf den Server. Nach der Übermittlung der Daten wird FIN gesendet
    • 3) Das dritte Mal : Der Server sendet FIN

    • Funktion: Der Server teilt dem Client mit, dass ich mit dem Senden fertig bin und die Verbindung geschlossen werden kann.
    • 4) Das vierte Mal: ​​Der Client sendet ACK

    • Funktion: Nach Erhalt der FIN befürchtet der Client, dass der Server nicht weiß, dass er geschlossen werden soll. Daher sendet er eine ACK, gibt TIME_WAIT ein und wartet auf 2MSL, wenn Es wird keine Antwort empfangen. Dies beweist, dass der Server geschlossen wurde, und der Client schließt zu diesem Zeitpunkt auch die Verbindung.

      Hinweis:
    • Wenn Sie die FIN-Nachricht der anderen Partei erhalten, bedeutet dies nur, dass die andere Partei keine Daten mehr sendet, aber weiterhin Daten empfangen kann.
    • Der letzte Grund, warum Sie auf 2MSL warten müssen, ist, dass die Das Netzwerk ist unzuverlässig. Wenn der Server das letzte ACK nicht empfängt, gibt er das FIN-Paket wieder und wartet darauf, dass der Client erneut ein ACK-Paket sendet, bevor er schließt (der Client kann die Verbindung also nicht sofort nach dem Senden des letzten ACK schließen). 6. HTTP-Statuscode 3xx: Weiterleitung : Anfrage erfolgreich

    301 : Permanente Weiterleitung

    30 2: Temporäre mobile

    • 400 fehlerhafte Anfrage: Syntaxfehler der Clientanfrage

    • 401 nicht autorisiert: Der Client hat keine Berechtigung

    • 403 verboten: Der Server lehnt die Client-Anfrage ab

    • 404 nicht gefunden: Die vom Client angeforderte Ressource existiert nicht

    • 500 Interner Serverfehler: Interner Serverfehler

    • 502 Schlechtes Gateway: Wenn ein Server, der als Gateway oder Proxy arbeitet, versucht, eine Anfrage auszuführen, wird eine ungültige Antwort vom Upstream-Server empfangen

    • 503 Überlastung des Dienstes nicht verfügbar oder Systemwartung

    • 504 Gateway-Timeout: Gateway-Timeout

    Gründe und Lösungen für 3, 502

    Ursache: Nginx hat die Anfrage an das Gateway (php-fpm) gesendet, um die Ausnahme zu behandeln, was zu

    1) Fastcgi-Puffereinstellung führt zu klein

    fastcgi_buffers 8 16k; code><code>fastcgi_buffers 8 16k;

          fastcgi_buffer_size 32k;

    2)php-cgi的进程数设置过少

         查看FastCgi进程数:netstat -anpo | grep "php-cgi"| wc -l

         调整参数最大子进程数:max_children

          一般按照单个进程20M计算需要需要设置的子进程数 

    3)max_requests(内存溢出或频繁重启)

         参数指明每个children最多能处理的请求数量,到达最大值之后会重启children。

          设置过小可能导致频繁重启children:

          php将请求轮询给每个children,在大流量的场景下,每一个children 到达最大值的时间差不多,如果设置过小可能多个children 在同一时间关闭,nginx无法将请求转发给php-fpm,cpu降低,负载变高。

           设置过大可能导致内存泄露

    4)php执行时间超过nginx等待时间

           fastcgi_connect_timeout

           fastcgi_send_timeout

           fastcgi_read_timeout

    5)fastcgi执行时间

          max_execution_time

    fastcgi_buffer_size 32k;

    2) Die Anzahl der PHP-CGI-Prozesse ist zu niedrig eingestellt

    Überprüfen Sie die Anzahl der FastCgi-Prozesse : netstat -anpo |. grep "php-cgi"|. wc - l

    Passen Sie die maximale Anzahl untergeordneter Prozesse an: max_children

    Im Allgemeinen die Anzahl der untergeordneten Prozesse Der Wert, der eingestellt werden muss, wird auf der Grundlage eines einzelnen Prozesses von 20 Mio. berechnet.

    3) max_requests (Speicherüberlauf oder häufige Neustarts)

    Der Parameter gibt die maximale Anzahl von Anfragen an, die jedes Kind verarbeiten kann. Kinder werden nach Erreichen des Maximalwerts neu gestartet .

            Eine zu kleine Einstellung kann zu häufigen Neustarts der untergeordneten Elemente führen:   In einem Szenario mit großem Datenverkehr erreicht jedes untergeordnete Element ungefähr zur gleichen Zeit den Maximalwert , mehrere Kinder können gleichzeitig sein, Nginx kann die Anfrage nicht an PHP-FPM weiterleiten, die CPU nimmt ab und die Last wird hoch.

                                                                                                                                                                                                       zu read_timeout G5) Fastcgi-Ausführungszeit

    max_execution_time

    Referenz:

    Detailliertes Verständnis der Optimierung von PHP+PHP-FOM+NGINX Konfigurationsparameter

    • Was soll ich das tun? Lösungsaustausch

    • 7. Der Unterschied zwischen http und HTTPS

      1. Port: http 80; https: 443
    • 2. http ist zustandslos, https ist ein mit http + SSL erstelltes Protokoll, das eine verschlüsselte Übertragung durchführen kann

      3. HTTP-Klartextübertragung, https-verschlüsselte Übertragung

      4. http ist schneller, Drei-Wege-Handshake mit drei Paketen, https erfordert 12 Pakete (3 TCP-Pakete + 9 SSL-Handshake-Pakete)

      8. Redis verteilte Sperren und Probleme 1. Implementierung: 1. Sperrung: setnx Probleme (hängt auf, nachdem die Einstellungen nach dem Sperren verfügbar sind)

    • Lösung:
    Redis 2.6.12 oder höher fügt optionale Parameter für die SET-Anweisung hinzu. Dies kann den Befehl setnx ersetzen.


    2) Andere Prozesssperren sind versehentlich nach Zeitüberschreitung gelöscht. (Bei der Ausführung von Prozess A tritt eine Zeitüberschreitung auf, wodurch die Sperre aufgehoben wird. Zu diesem Zeitpunkt erhält Prozess B die Sperre und beginnt mit der Verarbeitung der Anforderung. Zu diesem Zeitpunkt schließt Prozess A die Verarbeitung ab und die Sperre von Prozess B wird gelöscht Fehler) Lösung: Sie können nur die Sperre Ihres eigenen Prozesses löschen (Lua-Skript verhindert, dass Prozess B versehentlich die Sperre von Prozess A löscht, nachdem er die abgelaufene Sperre erworben hat)

    3) Parallelitätsszenario, das Ausführungszeitlimit des Prozesses A bewirkt, dass die Sperre aufgehoben wird, und Prozess B erhält zu diesem Zeitpunkt die Sperre.

    Lösung: Starten Sie den Daemon-Prozess und verzögern Sie die Sperre, bis der aktuelle Prozess abläuft.安全4) Einzelpunkt-Instanz-Sicherheitsproblem

    Nach dem Nachteil einer einzelnen Maschine können nicht alle Clients Sperren erhalten:

    Was sollten Sie bei der Implementierung verteilter Sperren in Redis beachten? [Zusammenfassung der Notizen]

    gibt Ihnen ein detailliertes Verständnis der verteilten Sperren in Redis

    9 Warum ist Redis Single-Threaded? Warum schnell?

    Empfohlene Lektüre: https://www.php.cn/redis/475918.html

    🎜10. Datentypen und Anwendungsszenarien von Redis🎜🎜🎜🎜1. Zeichenfolge: 🎜🎜🎜 gewöhnlicher Schlüssel/Wert Speicher🎜🎜🎜2, Hash:🎜🎜

    Hashmap: Schlüsselwert-Team-Sammlung, die Objektinformationen speichert

    Doppelt verknüpfte Liste: Nachrichtenwarteschlange

    HashMap, deren Wert immer null ist: ungeordnete Sammlung und keine Wiederholung : Berechnen Sie Schnittmenge, Vereinigung, Differenzmenge, Deduplizierungswert

    5, zset:

    Geordneter Satz ohne Duplikation: hashMap (Entfernung von Duplikationen) + Skiplist-Sprungtabelle (garantierte Reihenfolge): Rangliste

    Referenz:

    5 Datentypen und Anwendungsszenarien von Redis Datensatz auf Festplatte

    1) Verzweigen Sie einen Unterprozess und schreiben Sie den Snapshot-Inhalt in eine temporäre RDB-Datei (dump.rdb). Wenn der Unterprozess den Snapshot-Inhalt schreibt, ersetzt die neue Datei die alte Datei

    2 ) Die gesamte Redis-Datenbank enthält nur eine Sicherungsdatei

    3) Um die Leistung zu maximieren, ist nur der untergeordnete Fork-Prozess erforderlich, um die Persistenzarbeit abzuschließen, wodurch die Festplatten-IO reduziert wird

    4) Ausfallzeiten vor der Persistenz können zu Datenverlust führen

    2 . AOF-Persistenz: Zeichnen Sie alle Schreib- und Löschvorgänge des Servers in Form von Protokollen auf.

    1) Verwenden Sie jedes Mal, wenn ein Schreibbefehl empfangen wird, die Schreibfunktion, um an die Datei appendonly.aof anzuhängen. 2) Die persistente Datei wird immer größer, es gibt viele redundante Protokolle (0 erhöht sich um das 100-fache auf 100, es werden 100 Protokolldatensätze generiert)3) Verschiedene Fsync-Strategien können eingestellt werden

    appendfsync everysec: einmal alle 1s, bis zu 1s Daten gehen verloren (Standard)

    appendfsync Always: Wird bei jeder Änderung einmal ausgeführt

    appendfsync No: Nicht verarbeitet

    4) Die AOF-Datei wird neu geschrieben, wenn sie zu groß ist: Komprimieren Sie die AOF-Dateigröße

      Fork-Prozess, schreiben Sie den neuesten Status des lokalen Redis-Datenobjekts in die temporäre AOF-Datei (ähnlich dem RDB-Snapshot)
    • Die vom Hauptprozess empfangenen Änderungen werden zuerst in die geschrieben
    • Nachdem der untergeordnete Prozess das Neuschreiben abgeschlossen hat, werden die neuen Änderungen im Speicher synchron an die temporäre AOF-Datei angehängt
    • Der übergeordnete Prozess ersetzt die temporäre AOF-Datei durch eine neue AOF-Datei und benennt sie um. Später empfangene neue Befehle werden in neue Dateien geschrieben Nachteile? Wie wähle ich?

    • 12. Flash-Sale-Designprozess

    • 1. Statischer Cache

    • Drei Methoden: DNS-Abfrage, IP-Schuldenausgleich, CDN

    • 3 Begrenzungsmechanismus
    • Methode: IP-Strombegrenzung, Schnittstellen-Token-Strombegrenzung, Benutzer-Strombegrenzung, dynamisches Header-Token (Front-End-Verschlüsselung, Back-End-Entschlüsselung)
    4. Verteilte Sperre


    Methode:

    setnx + Expire (nicht atomar, Set stellt Atomizität nach Redis2.6 sicher)

    Zeitüberschreitung der Sperre freigeben (automatische Erneuerung des Daemons aktivieren)

    expired Lock hat versehentlich andere Threads gelöscht (RequestId-Überprüfung oder Lua-Skriptgarantie) Atomarität der Suche + löschen)

    5. Cache-Daten

    Methode:

    Cache-Aufschlüsselung: Aufwärmen der Cache-Daten + Bloom-Filter/leerer Cache

    Cache-Lawine: Cache-Einstellungen Zufällige Ablaufzeit, um Ablauf zu verhindern gleichzeitig

    6. Lagerbestand und Bestellungen

    • Lagerbestand abziehen

    • redis verringert den Lagerbestand selbst, was in gleichzeitigen Szenarien zu negativen Zahlen führen und sich auf die Lagerrendite auswirken kann: Verwenden Sie Lua-Skript, um die Atomizität sicherzustellen

    • Nachdem Redis den Lagerbestand zurückhält, werden dann asynchrone Nachrichten verwendet, um Bestellungen zu erstellen und Lagerbestandsänderungen zu aktualisieren.

    Die Datenbank aktualisiert den Lagerbestand mithilfe einer optimistischen Sperre: wobei stock_num - sale_num > 0

    Datensatztabelle für Nachrichtenversand hinzufügen und Wiederholungsmechanismus, um den Verlust asynchroner Nachrichten zu verhindern

    • Eine Bestellung erstellen
    • Das Front-End stellt eine Websocket-Verbindung her oder fragt ab, um den Bestellstatus zu überwachen

    Zurück zum Lager

    • Senden Sie nach dem Erstellen der Bestellung eine verspätete Nachricht, um den Zahlungsstatus der Bestellung zu überprüfen und ob der Lagerbestand an das Lager zurückgeschickt werden muss

      • 13. Anti-SQL-Injection
      • 1. Sonderzeichen filtern
      • 2. Datenbankschlüssel filtern

        3. Überprüfen Sie den Datentyp und das Format.

        4. Verwenden Sie den vorkompilierten Modus und binden Sie Variablen Daten: Schmutziges Lesen

        Die Transaktion sperrt die aktuell gelesenen Daten nicht

          Fügen Sie zum Zeitpunkt der Aktualisierung gemeinsame Sperren auf Zeilenebene hinzu, bis die Transaktion endet und freigegeben wird
          • Commit Read: Die gelesenen Daten Zwischen dem Start und dem Ende der Transaktion sind die Daten möglicherweise inkonsistent: Nichtwiederholbarkeit

          • Die Transaktion verfügt über eine gemeinsame Sperre auf Zeilenebene für die aktuell gelesenen Daten (wenn sie gelesen werden). Lesen Sie die vollständige Freigabe

        • Fügen Sie zum Zeitpunkt der Aktualisierung eine exklusive Sperre auf Zeilenebene hinzu und geben Sie sie bis zum Ende der Transaktion frei
          • Wiederholbares Lesen: Die vor Beginn und Ende der Transaktion gelesenen Daten sind konsistent. und andere Transaktionen in der Transaktion können die Daten nicht ändern: kann Wiederholtes Lesen

          • Die Transaktion fügt den aktuell gelesenen Daten vom Beginn der Transaktion an eine gemeinsame Sperre auf Zeilenebene hinzu

        • Fügt eine exklusive Sperre auf Zeilenebene hinzu im Moment der Aktualisierung und gibt sie am Ende der Transaktion frei
          • Andere Transaktionen fahren dann mit der Transaktion fort. Die neuen Daten können zu Phantomlesungen führen
          • Serialisierung

          • Fügen Sie bei Transaktionen gemeinsame Sperren auf Tabellenebene hinzu Daten lesen

        • Fügen Sie exklusive Sperren auf Tabellenebene hinzu, wenn Transaktionen Daten aktualisieren ist die Transaktion!! Isolationsstufe)
        • 1) Grundkonzepte
          • mvcc: Parallelitätskontrolle mehrerer Versionen: Durch Rückgängigmachen des Protokolls und der Leseansicht können die Daten gelesen werden, ohne die Daten zu sperren. Verbesserung der gleichzeitigen Verarbeitungsfähigkeit der Datenbank
          • Nur Schreibvorgänge werden gesperrt

        Ein Datenelement hat mehrere Versionen. Jedes Mal, wenn eine Transaktion Daten aktualisiert, wird eine neue Datenversion generiert. Die alten Daten bleiben erhalten im Undo-Log

        Wenn eine Transaktion gestartet wird, sind nur alle übermittelten Transaktionsergebnisse sichtbar

        • Aktuell gelesen: Die neueste Version lesen
          • Snapshot gelesen: Historische Version lesen
          • Lücke Sperre: Lückensperre sperrt den Index innerhalb eines Bereichs. Aktualisierungs-ID zwischen 10 und 20. Der gesamte Bereich wird gesperrt, unabhängig davon, ob Daten im Bereich vorhanden sind: ID = 15 einfügen, wird verhindert
          • Nur wiederholbare Leseisolationsstufe verfügt über Lückensperre

          • Next-Key-Sperre:
        • Datensatzsperre für Indexdatensatz + Lückensperre (Lückensperre zwischen Indexwert und vorherigem Indexwert)

        • Öffnen und Schließen

        • Phantomlesen verhindern

          • 2) Transaktionsisolationsstufe
          • Nicht festgeschriebener Lesevorgang
          • Die Transaktion sperrt nicht die aktuell gelesenen Daten, sondern die aktuellen Lesedaten
          A Eine gemeinsame Sperre auf Zeilenebene wird zum Zeitpunkt der Aktualisierung hinzugefügt und am Ende der Transaktion freigegeben.
        • Eine exklusive Sperre auf Zeilenebene wird zum Zeitpunkt der Aktualisierung hinzugefügt, bis die Transaktion freigegeben wird.

          • Wiederholbar. Die Lesetransaktion
          • sperrt die aktuell gelesenen Daten nicht In dem Moment, in dem bestimmte Daten aktualisiert werden, muss eine exklusive Sperre auf Zeilenebene (Datensatzsperre, GAP-Lückensperre, Next-Key-Sperre) hinzugefügt werden, die am Ende der Transaktion freigegeben wird Die Sperre löst das Phantomleseproblem. Wenn bei der Master-Slave-Replikation keine Lückensperre vorhanden ist, werden die A- und B-Prozesse der Master-Bibliothek gelöscht. Eine Prozesslösch-ID < ; kein Commit
          • B-Prozess fügt ID = 3 ein, Commit

        Ein Prozess sendet Commit

        • In diesem Szenario wird es einen Datensatz mit der ID = 3 in der Hauptbibliothek geben, aber das Binlog enthält „Deleting first“. und das anschließende Hinzufügen führt dazu, dass keine Daten in der Slave-Datenbank vorhanden sind, was zu inkonsistenten Daten zwischen Master und Slave führt. Der Snapshot von MVCC löst das Problem des nicht wiederholbaren Lesens. Serialisierung Transaktionales Lesen Beim Abrufen von Daten Tabellenebene hinzufügen, beim aktuellen Lesen eine exklusive Sperre auf Tabellenebene hinzufügen

            Transaktion aktualisiert Daten
          • Referenz:
        • Das Implementierungsprinzip der Transaktionsisolationsstufe in MySQL
          • Dieser Artikel erklärt ausführlich in MySQL die Prinzipien von Transaktionen und MVCC
          • Wie funktioniert Snapshot in MVCC?
          • Was ist MVCC und warum wurde Gap Lock entwickelt?
        • 15. Indexprinzip

          Der Index ist eine Speicherstruktur, die der Datenbank hilft, Daten effizient zu finden. Sie wird auf der Festplatte gespeichert und erfordert Festplatten-IO

          myisam unterstützt Tabellensperren und trennt Indizes und Daten. Der Speicher ist für die serverübergreifende Migration geeignet. Innodb unterstützt Zeilensperren, Indizes und Datenspeicherung in einer Datei. Indextyp: Hash-Index. Geeignet Für präzise Abfragen und hohe Effizienz sind ähnlich). Schlüssel. Ein Festplatten-E/A kann mehr Knoten erhalten. Sowohl interne Knoten als auch Blattknoten müssen keine Blattknoten finden, um Daten direkt zurückzugeben +tree fügt Zeiger von Blattknoten auf benachbarte Knoten hinzu, um das Durchlaufen von Rückabfragen zu erleichtern
          • Nicht gruppierter Index: Index und Daten werden getrennt gespeichert. Über den Index wird die Adresse ermittelt, an der die Daten tatsächlich gespeichert sind. und der Standard-Primärschlüsselindex ist ein Clustered-Index (wenn kein Primärschlüsselindex vorhanden ist, wählen Sie einen nicht leeren Index aus, und wenn kein impliziter Primärschlüsselindex vorhanden ist), zeigt der Hilfsindex auf den Clustered-Index-Speicherort und findet ihn dann die tatsächliche Speicheradresse
          • myisam verwendet einen nicht gruppierten Index, alle Indizes müssen nur einmal abgefragt werden, um die Daten zu finden

          Die Vorteile und das Potenzial des gruppierten Index

          1. Der Index und die Daten sind zusammen, und die Daten derselben Seite werden im (Puffer-)Speicher zwischengespeichert. Wenn Sie also die Daten derselben Seite anzeigen, müssen Sie sie nur aus dem Speicher entfernen.
          • 2. Nachdem die Daten aktualisiert wurden, müssen Sie nur Der Primärschlüsselindex muss beibehalten werden, und der Hilfsindex wird nicht beeinträchtigt. 3. Der Hilfsindex speichert den Wert des Primärschlüsselindex und nimmt mehr physischen Platz ein. Dies wird also beeinträchtigt

                        4. Bei Verwendung einer zufälligen UUID ist die Datenverteilung ungleichmäßig, was dazu führt, dass der Clustered-Index die gesamte Tabelle scannt und die Effizienz verringert. Versuchen Sie daher, die automatisch inkrementierende Primärschlüssel-ID zu verwenden
            • 16. Tabellenpartitionierung (Strategie für Sharding

            • 1. Prozess

            • Kapazität und Anzahl der Shards auswerten -> Sharding-Schlüssel basierend auf Geschäft auswählen -> Tabellen-Sharding-Regeln (Hash, Rest, Bereich) -> Ausführung - > Erweiterungsprobleme berücksichtigen
          • 2. Horizontale Aufteilung

            • Horizontale Aufteilung in mehrere Tabellen basierend auf Feldern

              • Die Struktur jeder Tabelle ist gleich

              • Die Sammlung aller Untertabellen ist die vollständige Menge

              • 3. Vertikale Aufteilung nach Feldern
            Die gleiche zugehörige Zeile der Untertabelle ist ein vollständiges Datenelement
          • Erweiterte Tabelle, Hot Fields und Nichtaufteilung von Hot Fields (Aufteilung von Listen und Details)
            • Vermeiden Sie beim Abrufen von Daten die Verwendung von Join, sondern kombinieren Sie die Ergebnisse von zwei Abfragen
              • 4. Problem
              Problem bei datenbankübergreifenden Verknüpfungen
            • Globale Tabelle: Szenarien, in denen einige Systemtabellen verknüpft werden müssen
              • Redundanzmethode: Gemeinsame Felder sind redundant
              • Assembly-Methode: Die Ergebnisse mehrerer Abfragen werden zusammengestellt
              • „Knotenübergreifende Paginierung, Sortierung, Funktionsprobleme“

                Verwenden Sie verteilte automatische Inkrementierende ID

              • Erweiterungsproblem

                Upgrade der Slave-Datenbank

              • Die Slave-Datenbank wird auf die Hauptdatenbank aktualisiert. Die Daten sind konsistent und Sie müssen nur redundante Daten löschen.
          Doppelte Erweiterung : Sie müssen die Slave-Datenbank verdoppeln

          Doppelte Schreibmigration:

          Neue Daten werden doppelt geschrieben und gleichzeitig in die neue und alte Datenbank geschrieben

          • Die alten Daten werden kopiert zur neuen Datenbank

          • Überprüfen Sie die Datenkonsistenz und löschen Sie die verbleibenden Daten

          • Siebzehn, wählen Sie den Ausführungsprozess aus und aktualisieren Sie ihn

            • Serverschicht: Connector->Cache->Analysator (Präprozessor)->Optimierer->Executor

            • Engine-Schicht: Daten abfragen und speichern

            2, Ausführungsprozess auswählen

            • Der Client sendet eine Anfrage und stellt eine Verbindung her

            • Die Serverschicht durchsucht den Cache und gibt bei einem Treffer direkt zurück, andernfalls fahren Sie fort

            • Analyse sieben Analysen von SQL-Anweisungen und Vorverarbeitung (Feldlegalität und -typ überprüfen usw.)

            • Der Optimierer generiert einen Ausführungsplan.

            • Der Ausführende ruft die Engine-API auf, um die Ergebnisse abzufragen

            • Der Pufferpool (Cache-Pool) befindet sich im Speicher. Wenn Sie die Daten derselben Seite das nächste Mal lesen, können Sie sie direkt aus dem Pufferpool (dem Clustered-Index von innodb) zurückgeben.

            Aktualisieren Sie den Puffer, wenn Sie Daten aktualisieren Zuerst den Pool und dann die Festplatte aktualisieren

              Dirty Pages: Der Pufferpool im Speicher wird aktualisiert, aber die Festplatte wird nicht aktualisiert
              • Dirty Brushing: In inndb gibt es einen speziellen Prozess zum Schreiben der Pufferdaten Pool auf die Festplatte. Von Zeit zu Zeit werden weitere Daten auf die Festplatte geschrieben Protokoll, physisches Protokoll, zeichnet Änderungen auf
              • Redo-Protokoll wird wiederholt geschrieben, der Speicherplatz ist festgelegt und Es wird aufgebraucht und das alte Protokoll wird überschrieben
              • binlog ist ein von der Serverschicht gemeinsam genutztes Protokoll, ein logisches Protokoll und die ursprüngliche Logik der Aufzeichnungsanweisung
              • binlog wird an eine bestimmte Größe angehängt und auf die nächste umgestellt und überschreibt das vorherige Protokoll nicht
              • Redo-Protokoll wird hauptsächlich zum Wiederherstellen von Abstürzen verwendet, bin log wird zum Aufzeichnen archivierter Binärprotokolle verwendet. Redo-Log kann Daten nur für einen kurzen Zeitraum wiederherstellen. Binlog kann größere Daten über Einstellungen wiederherstellen. Protokollierungsschema zuerst
                • Protokollierung ist sequenzielles IO
                • Direktes Schreiben auf die Festplatte (Leeren) ist zufälliges IO, da die Daten zufällig sind und an verschiedenen Orten verteilt sein können. Sektor
                • Sequenzielles IO ist effizienter. Schreiben Zuerst das Änderungsprotokoll, was die Löschmöglichkeit verzögern und den Durchsatz verbessern kann Prüfpunkt vorne (das alte Protokoll wird an dieser Stelle überschrieben), Schreibpunkt (aktuell geschriebene Position) hinten, Schreibpunkt und Wenn sich die Prüfpunkte überschneiden, beweist dies, dass das Redo-Protokoll voll ist, und dies ist erforderlich Beginnen Sie mit der Synchronisierung des Redo-Protokolls mit der Festplatte
                • Ausführungsschritte (zweiphasiges Commit – verteilte Transaktion, Sicherstellung der Konsistenz der beiden Protokolle)
                • Analysieren Sie die Aktualisierungsbedingungen und finden Sie die Daten, die benötigt werden aktualisiert werden (Cache wird verwendet)
                • Der Server ruft die API der Engine-Schicht auf, Innodb aktualisiert die Daten in den Speicher, schreibt dann das Redo-Protokoll und gibt dann die Vorbereitung ein
              • Engine-Benachrichtigung Die Serverschicht beginnt damit Daten übermitteln

                • Die Serverschicht schreibt das Binlog-Protokoll und ruft die Innodb-Schnittstelle auf, um eine Commit-Anfrage zu stellen.

                • Die Engine-Schicht sendet das Commit nach Erhalt der Anfrage

                • Wenn der Redo-Log-Status „Festschreiben“ lautet, senden Sie ihn direkt.

              • Wenn der Redo-Log-Status „Vorbereiten“ lautet, beurteilen Sie, ob die Transaktion im Binlog festgeschrieben ist. Wenn ja, schreiben Sie sie fest, andernfalls setzen Sie sie zurück
                • ... fertig, und die Maschine ist zu diesem Zeitpunkt ausgefallen. Zu 2. Nach dem Neustart ist das Redo-Log abgeschlossen, sodass der Datenwert = 10
                • 3. Es gibt keinen Eintrag im Bin-Log-Protokoll. Wenn Sie die Daten wiederherstellen müssen, ist der Wert = 9

                • Schreiben Sie zuerst das Binlog, bevor Sie das Redo-Log schreiben

                • 1 . Das Schreiben des Binlogs ist abgeschlossen, aber das Redo-Log ist noch nicht abgeschlossen
                • 2. Nach dem Neustart ist kein Redo-Log vorhanden, daher ist der Wert immer noch 9

                • 3. Wann Die Daten müssen wiederhergestellt werden, das Binlog ist vollständig und der Wert wird auf 10 aktualisiert Aktualisierungsprozess, direkter Rollback auf den Undo-Log-Status
            • 18. Die Rolle von Binlog und die drei Formate

              • :

              • 1. Datenwiederherstellung
              • 2. Master-Slave-Replikation

              • Format (Binärdatei):

              • 1) Anweisung
              • 1 Notieren Sie den Originaltext jeder SQL-Anweisung
              • 2. Um eine Tabelle zu löschen, müssen Sie nur eine SQL-Anweisung aufzeichnen, und es ist nicht erforderlich, Änderungen in jeder Zeile aufzuzeichnen, wodurch IO eingespart, die Leistung verbessert und die Anzahl der Protokolle reduziert wird.

              • 3 -Slave-Inkonsistenz kann auftreten (gespeicherte Prozeduren, Funktionen usw.)

              • 4. Da die Binlog-Aufzeichnungsreihenfolge in der Transaktions-Commit-Reihenfolge aufgezeichnet wird, kann es zu Inkonsistenzen im Master-Slave kommen Replikation. Dies kann durch die Einführung von Lückensperren auf der Ebene der wiederholbaren Lesevorgänge gelöst werden.

              2) Zeile

              • 1. Zeichnen Sie die Änderung jedes Datensatzes auf, ohne den Kontextdatensatz der SQL-Anweisung aufzuzeichnen

              • 2. Dies führt zu einer großen Menge an Binlog-Protokollen

              • 3 Tabelle: Notieren Sie die Situation jedes gelöschten Datensatzes

              3) gemischt

              • 1 Eine gemischte Version der ersten beiden Formate

              • 2. Wählen Sie automatisch aus, welches Sie verwenden möchten, basierend auf der Anweisung:

                • Allgemein: Um die SQL-Anweisung zu ändern, verwenden Sie die Anweisung

                • , um die Tabellenstruktur, die Funktion, die gespeicherte Prozedur und andere Vorgänge zu ändern. Alle aufgezeichneten Änderungen werden weiterhin aufgezeichnet

                • 19. Master-Slave-Synchronisation (Die Prinzipien und Probleme der Master-Slave-Replikation) und Lese-Schreib-Trennung

              • Datenverteilung

              Lastausgleich

              Datensicherung, hohe Verfügbarkeit, Single Point of Failure vermeiden

              • Lese-/Schreibtrennung erreichen und Datenbankdruck entlasten

              • Upgrade-Test (verwenden Sie eine höhere Version von MySQL als Slave-Bibliothek)

              • 2 Unterstützt Replikationstypen (drei Formate von Binlog)
              • Basierend auf SQL-Replikation von Anweisungen
              • Zeilenbasierte Replikation

              Hybridreplikation

              • 3. Prinzip
              • 1) Grundlegend Konzepte

              • Generieren Sie zwei Threads aus der Bibliothek.

              E/A-Thread.

              SQL-Thread

                2) Prozess (der Der Master-Knoten muss die Bin-Log-Funktion aktivieren.)
                • 1. Nachdem der Knoten den Start-Slave-Befehl gestartet hat, erstellen Sie einen E/A-Prozess, um eine Verbindung zum Master-Knoten herzustellen Der Knoten erstellt einen Protokoll-Dump-Thread (der Master-Knoten erstellt einen Protokoll-Dump-Thread für jeden Slave-Knoten). Slave-Knoten
                • 4. Wenn der Dump-Log-Thread des Master-Knotens den Bin-Log-Inhalt liest, sendet er ihn an den Master-Knoten. Das Bin-Log wird gesperrt und die Sperre wird aufgehoben, bevor es nach dem Lesen an den Slave-Knoten gesendet wird ist abgeschlossen
                • 5. Der IO-Thread des Slave-Knotens empfängt den vom Master-Knoten gesendeten Binlog-Inhalt und schreibt ihn in die lokale Relay-Protokolldatei
              • 6 Der Master-Slave-Knoten lokalisiert die Master-Slave-Synchronisation Position durch die Binlog-Datei + Positionsoffset. Wenn der Slave-Knoten ausfällt und neu startet, initiiert er automatisch die Synchronisierung von der Positionsposition.

                7 Kopieren und lesen Sie den Inhalt Lokales Relay-Protokoll aus dem SQL-Thread des Knotens, analysieren Sie es in bestimmte Vorgänge und führen Sie diese aus, um die Master-Slave-Datenkonsistenz sicherzustellen
                • 1. Kann eine Master-Slave-Inkonsistenz verursachen (Master-Slave-Verzögerung)

              • 2 Nachdem der Masterknoten die vom Client übermittelte Transaktion übermittelt hat, sendet er sie direkt an den Client zurück

                3. Wenn nach der Übermittlung der Master-Knoten-Transaktion der Protokoll-Dump abstürzt, bevor er geschrieben werden kann, führt dies dazu, dass die Master-Slave-Daten inkonsistent sind
              • 4. Sie müssen sich darüber keine Sorgen machen Beim Master-Slave-Synchronisationsvorgang ist die Leistung am besten Wenn der Knoten die vom Client übermittelte Transaktion empfängt, muss er darauf warten, dass das Binlog an die Slave-Bibliothek gesendet wird und alle Slave-Bibliotheken ausgeführt wurden. Die Transaktion wird erst nach
              • 3) im halbsynchronen Modus an den Client zurückgegeben
              • 1. Erhöhen Sie einen Teil der Zuverlässigkeit und erhöhen Sie einen Teil der Antwortzeit der Hauptdatenbank.
              • 2 Nachdem der Masterknoten die vom Client übermittelte Transaktion erhalten hat, warten Sie, bis das Binlog an mindestens gesendet wird eine Slave-Bibliothek und erfolgreich im lokalen Relay-Protokoll gespeichert. Zu diesem Zeitpunkt übermittelt die Hauptbibliothek die Transaktion und gibt sie an den Client zurück
              • 4) Konfiguration von Server-ID und Server-UUID
              • 1 -id wird verwendet, um die Datenbankinstanz zu identifizieren, um Endlosschleifen von SQL-Anweisungen in verketteten Master-Slave- und Multi-Master-Slave-Topologien zu verhindern für den Host aufgezeichnet, aber alle Slave-Verbindungen werden abgelehnt.
              • 2. server-id = 0 verweigert die Verbindung zu anderen Instanzen für den Slave

              3 ist eine globale Variable und der Dienst muss nach der Änderung neu gestartet werden

                4 Bibliothek Wenn es mit der Server-ID der Slave-Bibliothek übereinstimmt
                • Die Standard-Replicate-Same-Server-ID = 0, die Slave-Bibliothek überspringt alle Master-Slave-Synchronisierungsdaten, was zu einer Inkonsistenz der Master-Slave-Daten führt führt zur Ausführung einer drahtlosen Schleife in SQL Master-Bibliothek (A) findet die gleiche Server-ID und wird getrennt. Die Verbindung wird erneut registriert.

                • Die Verbindung der B- und C-Slave-Bibliotheken wird immer wieder neu verbunden.

              • MySQL-Dienst erstellt und generiert automatisch die Server-UUID-Konfiguration Replicate-Same-Server-ID=1 (nicht empfohlen)

                • 5. Lese-/Schreibtrennung

                • 1) Basierend auf Code-Implementierung, Reduzierung der Hardwarekosten
              • 2) Basierend auf Zwischen-Proxy-Implementierung
              • 3) Master-Slave-Verzögerung

                • Die Leistung der Slave-Bibliothek ist schlechter als die der Hauptbibliothek

              • Eine große Anzahl von Abfragen führt zu hohem Druck auf die Slave-Bibliothek und verbraucht viele CPU-Ressourcen die Synchronisationsgeschwindigkeit: ein Master und mehrere Slaves

              Ausführung großer Transaktionen: Das Binlog wird erst geschrieben, wenn die Transaktion ausgeführt wird, und die Leseverzögerung der Slave-Bibliothek

              Hauptbibliotheks-DDL (Ändern, Löschen, Erstellen)

                20. Deadlock
              • 1. Bedingungen für den gegenseitigen Ausschluss
              • 2. Alle Ressourcen werden gleichzeitig zugewiesen, andernfalls werden keine zugewiesen
              • 3. Nichtdeprivationsbedingung: Wenn der Prozess einige Ressourcen erhält und auf andere Ressourcen wartet, gibt er die belegten Ressourcen frei
              • 4. Schleifenwartebedingung:
              Verständnis: Eine Ressource kann nur von einer belegt werden Prozess, und der Prozess erhält die Ressource. Sie können auch neue Ressourcen beantragen, und die erhaltenen Ressourcen können nicht entzogen werden. Gleichzeitig warten mehrere Prozesse aufeinander auf Ressourcen, die von anderen Prozessen belegt werden

              2. Lösen Sie den Deadlock

              1. Beenden Sie die Prozesse (töten Sie sie alle)
              • 2. Pflanzen Sie einen nach dem anderen (töten Sie einen, um zu sehen, ob er entlastet wird)
              • großes Paging-Abfragelimit 100000 (Offset), 10 (page_sie)
              • 1. Grund

              • Wenn MySQL Paging-Daten abfragt, überspringt es den Offset (100000) nicht direkt, sondern nimmt Offset + Seitengröße = 100000 + 10 = 100010 Stück der Daten und verwirft dann die ersten 100.000 Daten, sodass die Effizienz gering ist Automatisch inkrementiert, werden die Maximal- und Minimalwerte des Primärschlüssels, die die Bedingungen erfüllen, anhand der Bedingungen berechnet (unter Verwendung des Deckungsindex). , Redis-Cache und MySQL-Datenkonsistenz

                Methode:

              1. Aktualisieren Sie zuerst Redis und aktualisieren Sie dann die Datenbank

              Szenario: Aktualisierungssatzwert = 10, wobei Wert = 9

               1) Redis-Update ist erfolgreich: Redis-Wert = 10
              •  2) Datenbankaktualisierung schlägt fehl: MySQL-Wert = 9

                 3) Daten sind inkonsistent
              • 2. Aktualisieren Sie zuerst die Datenbank, dann aktualisieren Sie Redis

                Szenario: A Prozessaktualisierungssatzwert = 10, wobei Wert = 9; Prozess B update set value = 11 where value = 9;
               1) Prozess A aktualisiert zuerst die Datenbank, hat aber noch nicht in den Cache geschrieben: MySQL-Wert = 10; Redis-Wert = 9

              2) Prozess B aktualisiert die Datenbank und sendet sie die Transaktion und schreibt den Cache: MySQL-Wert = 11;

               3) Prozess A schließt die Anfrage ab und sendet die Transaktion, schreibt den Cache: Redis-Wert = 10; ; Redis-Wert = 10

              3. Löschen Sie zuerst den Cache und aktualisieren Sie dann die Datenbank

              Szenario: Prozess A aktualisiert den Wert = 9; Prozess B fragt den Wert ab;

              1) Prozess A löscht zuerst den Cache Dann war keine Zeit, die Daten zu ändern, oder die Transaktion wurde nicht übermittelt.

              2) Prozess B begann mit der Abfrage und traf nicht auf den Cache, also überprüfte er die Datenbank und schrieb sie in den Cache. Redis-Wert = 9
              • 3) Prozess A hat die Datenbank aktualisiert und den MySQL-Wert = 10 abgeschlossen.

              • Lösung:
              • 1. Verzögertes doppeltes Löschen. Szenario: Ein Prozessaktualisierungssatzwert = 10 value = 9; B-Prozessabfragewert;
              • 1) A Der Prozess löscht zuerst den Cache und hatte keine Zeit, die Daten zu ändern, oder die Transaktion wurde nicht übermittelt

                2) Prozess B beginnt mit der Abfrage und trifft nicht Cache, also überprüft er die Datenbank und schreibt in den Cache Redis-Wert = 9
              3) Prozess A aktualisiert die Datenbank und schließt MySQL-Wert = 10 ab

              4) Prozess A schätzt die Verzögerungszeit und löscht den Cache nach dem Ruhezustand erneut

              5) Schließlich ist der MySQL-Wert = 10; der Redis-Wert ist leer (überprüfen Sie beim nächsten Mal direkt die Datenbank)

              6) Der Grund für die Verzögerung besteht darin, zu verhindern, dass Prozess B in den Cache schreibt

              2. Serialisierung anfordern

              1) Erstellen Sie zwei Warteschlangen: Aktualisierungswarteschlange und Abfragewarteschlange

              2) Wenn die Cache nicht existiert und die Datenbank überprüft werden muss, wird der Schlüssel in der Update-Warteschlange gespeichert

              3) Wenn eine neue Anfrage eingeht, bevor die Abfrage abgeschlossen ist, und festgestellt wird, dass der Schlüssel noch in der Update-Warteschlange vorhanden ist , der Schlüssel wird in die Abfragewarteschlange gestellt und gewartet; Wenn er nicht vorhanden ist, wiederholen Sie den zweiten Schritt

              4) Wenn die abgefragten Daten feststellen, dass die Abfragewarteschlange bereits vorhanden ist, besteht keine Notwendigkeit, erneut in die Warteschlange zu schreiben

              5) Nachdem die Datenaktualisierung abgeschlossen ist, aktualisiert rpop die Warteschlange, und gleichzeitig fragt rpop die Warteschlange ab und gibt die Abfrageanforderung frei.

              6) Abfrageanforderungen können while + Sleep verwenden, um den Cache abzufragen und die maximale Verzögerungszeit festzulegen . Wenn es nicht abgeschlossen ist, wird es leer zurückgegeben . pconnect (lange Verbindung): Die Verbindung wird nicht freigegeben, wenn das Skript endet, und ihr Lebenszyklus folgt dem Lebenszyklus des PHP-FPM-Prozesses Die Verbindung wird nicht freigegeben. Es ist nur so, dass Redis im aktuellen PHP-CGI-Prozess nicht erneut angefordert werden kann. Nachfolgende Verbindungen im aktuellen PHP-CGI können weiterhin wiederverwendet werden, bis PHP-FPM den Lebenszyklus beendet

              2. Reduzieren Sie den Verbrauch beim Herstellen von Redis-Verbindungen

              3. Reduzieren Sie die Anzahl der von einem PHP-FPM hergestellten Verbindungen.

              4. Verbrauchen Sie mehr Speicher und die Anzahl der Verbindungen steigt weiter

              5. Die vorherige Anfrage des Worker-Unterprozesses (php-cgi) kann sich auf die nächste Anfrage auswirken 1; Variable B wählt Datenbank aus 2; wirkt sich auf Variable A aus? Lösung: Jede Datenbank erstellt eine Verbindungsinstanz. 24. Das Prinzip der Verwendung von Skiplist für die Redis-Zset-geordnete Sammlung. 1. Grundkonzept
                1. Skiplist sind zufällige Daten, die Elemente in einer hierarchisch verknüpften Liste auf geordnete Weise speichern (kann nur verwendet werden, wenn die Elemente geordnet sind)
              • 2. Skiplist wird tatsächlich auf der Grundlage geordneter verknüpfter Listen entwickelt und ist mehrschichtig Verknüpfte Listen

                  3 . Doppelte Werte sind zulässig, daher muss die Vergleichsprüfung nicht nur den Schlüssel, sondern auch den Wert vergleichen
                • 4. Jeder Knoten hat einen Rückzeiger mit einer Höhe von 1, der für die Iteration von verwendet wird Kopfrichtung zur Schwanzrichtung

                • 5. Zeitkomplexität O(logn), Raumkomplexität O(n)
                • 2, Vergleich zwischen Sprungtabelle und ausgeglichenem Baum
              • 1) Effizienz der Bereichsabfrage
              • Die Sprungtabelle Die Bereichsabfrage ist effizienter, da der Mindestwert gefunden wird. Danach müssen Sie nur noch die verknüpfte Liste der ersten Ebene durchlaufen, bis sie kleiner als der Maximalwert ist.
              • Die ausgewogene Baumbereichsabfrage findet den Mindestwert und führt ihn dann aus eine Durchquerung in der Reihenfolge, um andere Knoten zu finden, die den Maximalwert nicht überschreiten
              • 2) Speicherbelegung
              • skiplist, die Anzahl der Zeiger für jeden Knoten beträgt 1/(1-p)

              The Die Anzahl der Zeiger für jeden Knoten des ausgeglichenen Baums beträgt 2

              • 3) Einfüge- und Löschvorgänge

              • skiplist Sie müssen nur die Zeiger benachbarter Knoten ändern der Unterbaum

              25. Der abgelaufene Lösch- und Eliminierungsmechanismus von Redis

              1. Herkömmliche Strategie zum abgelaufenen Löschen

              1) Geplantes Löschen

              Verwenden Sie den Timer, um sofort zu löschen, wenn er abläuft

              Der Speicher ist Rechtzeitig freigegeben, verbraucht aber mehr CPU. Bei großer Parallelität werden CPU-Ressourcen verbraucht und die Geschwindigkeit der Verarbeitungsanfragen wird beeinträchtigt Überprüfen Sie, ob die Schlüssel abgelaufen sind. Überprüfen Sie, ob sie abgelaufen sind, und löschen Sie sie, wenn Sie sie das nächste Mal herausnehmen müssen. CPU-freundlich verzögertes Löschen + regelmäßiges Löschen, übernommen von Redis

              Testen Sie regelmäßig nach dem Zufallsprinzip einige Schlüssel mit zur Überprüfung festgelegter Ablaufzeit und löschen Sie sie nach Ablauf

              • Die Reinigungszeit jedes Mal überschreitet nicht 25 % der CPU und Die Zeit ist erreicht. Beenden Sie dann die Prüfung.

              • Es werden keine regelmäßig gelöschten Schlüssel gelöscht, und Schlüssel, die in Zukunft nicht mehr verwendet werden, sind weiterhin im Speicher vorhanden. Sie müssen also mit der Eliminierungsstrategie kooperieren

              3. Eliminierungsstrategie (der Speicher reicht nicht aus, um neue Daten zur Ausführungszeit zu schreiben)

                • volatile-lru: Die Ablaufzeit ist festgelegt und je weniger kürzlich verwendet wurde, desto Priorität wird der Eliminierung gegeben.

                • volatile-ttl: Die Ablaufzeit ist festgelegt. Je früher die Ablaufzeit liegt, desto Priorität hat die Eliminierung eliminiert

                • volatile-random : Ablauf wird nach dem Zufallsprinzip festgelegt und rechtzeitig gelöscht

                • allkeys-lru : Je früher die Ablaufzeit aller Schlüssel ist, desto höher wird die Priorität eliminiert

                • allkeys-random : Alle Schlüssel werden gelöscht zufällig im Ablauf gelöscht

                • keine Enviction: Eliminierung ist nicht zulässig, nicht genügend Speicher Fehlerberichterstattung

                Sechsundzwanzig, häufige Redis-Probleme und Lösungen

                1. Cache-Lawine: Eine große Anzahl von Cache-Fehlern am Gleichzeitig führt dies dazu, dass Anfragen die Datenbank direkt abfragen, was den Datenbankspeicher und die CPU-Belastung oder sogar Ausfallzeiten erhöht. Lösung: Hotspot-Daten laufen nie ab oder werden auf verschiedene Instanzen verteilt, wodurch Probleme bei Ausfällen einzelner Maschinen reduziert werden Fügen Sie der Cache-Zeit Zufallszahlen hinzu, um zu verhindern, dass eine große Anzahl von Caches gleichzeitig ungültig wird

                Führen Sie einen Second-Level-Cache oder einen Double-Cache aus. A ist der ursprüngliche Cache mit kurzer Aktualität, B ist der Backup-Cache, der gültig ist für eine lange Zeit. Doppelter Schreibcache beim Aktualisieren
                • 2. Cache-Penetration: Es sind keine Daten im Cache und in der Datenbank vorhanden. Bei einer großen Anzahl von Anfragen dringen alle Anfragen direkt in die Datenbank ein, was zu Ausfallzeiten führt.
                • Lösung:
                • Bloom-Filter: bestehend aus einem Bitvektor oder einer Bitliste der Länge m (nur eine Liste mit 0- oder 1-Bit-Werten)

                Verwenden Sie mehrere verschiedene Hash-Funktionen, um mehrere zu generieren Der Indexwert , geben Sie den Wert ein, der mehreren Positionen entspricht, ist 1

                Der Bloom-Filter kann prüfen, ob der Wert „vielleicht in der Menge“ oder „definitiv nicht in der Menge“ ist
                • Es kann sein, dass die grundlegende Filterung falsch eingeschätzt wird Die Effizienz ist hoch
                  • In extremen Fällen, wenn im Bloom-Filter kein freier Speicherplatz vorhanden ist, gibt jede Abfrage „true“ zurück
                  • 3. Cache-Hit-Verschleiß: Es sind Daten in der Datenbank vorhanden, aber nachdem der Cache plötzlich ausgefallen ist, sind viele Anfragen aufgetreten, was den Druck auf die Datenbank erhöht und sogar Ausfallzeiten verursacht hat

                  • Lösung:
                  • heiße Daten Läuft nie ab
                  • Mutex-Sperre: Unabhängig vom Erfolg nach dem Erwerb der Sperre muss die Sperre aufgehoben werden
                • Siebenundzwanzig Detaillierte Erklärung und Lebenszyklus von PHP-FPM
                • 1

                1) CGI-Protokoll

                Die Codedatei der dynamischen Sprache muss das entsprechende übergeben. Der Parser kann vom Server erkannt werden

                • Das CGI-Protokoll wird verwendet, um dem Server und dem Interpreter die Kommunikation miteinander zu ermöglichen Sonstiges

                • Der Server benötigt den PHP-Interpreter und das entsprechende CGI-Protokoll, um die PHP-Datei zu analysieren.

                2) CGI-Programm = php-cgi

                php-cgi ist ein CGI-Programm, das dem CGI entspricht Protokoll

                und ist auch ein PHP-Interpreter

                • Standard-CGI analysiert php.ini für jede Anfrage, initialisiert die Ausführungsumgebung usw. und verringert so die Leistung

                • Jedes Mal, wenn Sie die Konfiguration ändern, müssen Sie dies tun re-php-cgi, damit php.ini wirksam wird

                • Sie können Arbeiter nicht dynamisch planen, Sie können nur die Anzahl der Arbeiter am Anfang angeben

                3) FastCGI-Protokoll

                • Es ist auch ein Protokoll /standard wie CGI, aber auf Basis von CGI optimiert und effizienter. Es wird zur Verbesserung der Leistung von CGI-Programmen verwendet. 4) FastCGI-Programm = php-fpm php-fpm ist ein FastCGI-Programm, das dem FastCGI-Protokoll entspricht.

                • Der Verwaltungsmodus des FastCGI-Programms für CGI-Programme. Starten Sie einen Master-Prozess, analysieren Sie die Konfigurationsdatei und initialisieren Sie die Umgebung. Starten Sie mehrere Worker-Sub -Prozesse

                • Übergeben Sie die Anforderung nach Erhalt zur Ausführung an den Arbeitsprozess.

                • Lösen Sie das Problem des reibungslosen Neustarts nach der Änderung von php.ini Wiederverwendungssignal Die Timeout-Zeit (verarbeiten Sie die Anfrage innerhalb der angegebenen Zeit und ignorieren Sie sie, wenn sie nicht abgeschlossen werden kann)
                • Legen Sie die Zeit fest, die PHP-FPM dem Fastcgi-Prozess zur Verfügung stellt, um auf das Neustartsignal zu reagieren

                  process_control_timeout = 0, was bedeutet, dass es nicht wirksam wird und keinen reibungslosen Neustart gewährleisten kann.
                • Die Einstellung von „process_control_timeout“ ist zu groß, was zu einer Überlastung der Systemanforderungen führen kann.
                • process_control_timeout = 10, wenn die Codelogik 11 Sekunden dauert, kann ein Neustart der alten Version zur Codeausführung führen Teil zum Beenden
                • Empfohlener Wert: request_terminate_timeout

    Das obige ist der detaillierte Inhalt vonTeilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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