Soll die Like-Funktion MySQL oder Redis verwenden?

Soll die Like-Funktion MySQL oder Redis verwenden?

Dies ist eine Interviewfrage, die mir kürzlich gestellt wurde. Dieser Blog fasst diese Frage zusammen und teilt sie.

1. Häufige Fehler von Anfängern

Vielleicht würden viele Neulinge (einschließlich mir damals, haha) zuerst daran denken, so etwas zu schreiben:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    für (String-Plattform: Plattformliste) {
        if (platform.equals("Plattform")) {
            PlattformList.entfernen(Plattform);
        }
    }
 
    System.out.println(Plattformliste);
}

Dann habe ich es mit Zuversicht ausgeführt, aber es stellte sich heraus,
java.util.ConcurrentModificationException ist eine Ausnahme, was auf Chinesisch „Ausnahme gleichzeitiger Änderung“ bedeutet.

Wie Funktion: MySQL oder Redis verwenden?

Sind Sie verwirrt und fragen sich, warum das passiert?

Schauen wir uns zunächst den durch den obigen Code generierten Bytecode an, wie unten dargestellt:

Wie Funktion: MySQL oder Redis verwenden?

Daraus können wir ersehen, dass bei der tatsächlichen Ausführung der foreach-Schleife tatsächlich ein Iterator verwendet wird und dass die verwendeten Kernmethoden hasnext() und next() sind.

Schauen wir uns dann an, wie der Iterator der ArrayList-Klasse implementiert ist.

Wie Funktion: MySQL oder Redis verwenden?

Es ist ersichtlich, dass beim Aufrufen der Methode next () zum Abrufen des nächsten Elements die erste Codezeile darin besteht, checkForComodification (); aufzurufen, und die Kernlogik dieser Methode besteht darin, die Werte der beiden Variablen modCount und expectedModCount zu vergleichen.

Im obigen Beispiel sind die Werte von modCount und expectedModCount zu Beginn beide 3, sodass es kein Problem gibt, das Element „博客园“ zum ersten Mal zu erhalten, aber wenn die folgende Codezeile ausgeführt wird:

PlattformList.entfernen(Plattform);

Der Wert von modCount wird auf 4 geändert.

Wie Funktion: MySQL oder Redis verwenden?

Beim zweiten Abrufen des Elements sind die Werte von modCount und expectedModCount nicht gleich und daher wird der Fehler ausgelöst.
java.util.ConcurrentModificationException.

Wie Funktion: MySQL oder Redis verwenden?

Da dies mit foreach nicht erreicht werden kann, wie können wir es implementieren?

Es gibt drei Hauptmethoden:

  • Verwenden der remove()-Methode des Iterators
  • Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufen
  • Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufen

Als nächstes werde ich sie einzeln erklären.

2. Verwenden Sie die remove()-Methode des Iterators

Die Implementierung der remove()-Methode mit Iterator ist wie folgt:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    Iterator<String> iterator = Plattformliste.iterator();
    während (Iterator.hasNext()) {
        String-Plattform = Iterator.next();
        if (platform.equals("Plattform")) {
            iterator.entfernen();
        }
    }
 
    System.out.println(Plattformliste);
}

Die Ausgabe ist:

[CSDN, Nuggets]

Warum können wir iterator.remove() verwenden? Schauen wir uns den Quellcode an:

Wie Funktion: MySQL oder Redis verwenden?

Es ist ersichtlich, dass jedes Mal, wenn ein Element gelöscht wird, der Wert von modCount expectedModCount neu zugewiesen wird, sodass die beiden Variablen gleich sind und nicht ausgelöst werden
java.util.ConcurrentModificationException. Weitere Interviewfragen finden Sie im offiziellen Konto Java Interview Questions Selection

3. Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufen

Die Implementierung der Vorwärtsdurchquerung mithilfe einer For-Schleife sieht wie folgt aus:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    für (int i = 0; i < platformList.size(); i++) {
        Zeichenfolgeelement = Plattformliste.get(i);
 
        if (item.equals("Element löschen")) {
            Plattformliste.entfernen(i);
            = i - 1;
        }
    }
 
    System.out.println(Plattformliste);
}

Diese Implementierung ist relativ einfach zu verstehen, d. h. das Löschen erfolgt über den Array-Index. Es gibt jedoch einen Hinweis, dass nach dem Löschen des Elements der Indexwert korrigiert werden muss:

= i - 1;

Warum müssen wir den Wert des Index korrigieren? Denn der Index des Anfangselements sieht folgendermaßen aus:

Wie Funktion: MySQL oder Redis verwenden?

Nach dem Löschen des Elements „博客园“ in der ersten Schleife sieht der Index des Elements wie folgt aus:

Wie Funktion: MySQL oder Redis verwenden?

In der zweiten Schleife ist der Wert von i gleich 1, was bedeutet, dass das Element „Nuggets“ genommen wird, was dazu führt, dass das Element „CSDN“ übersprungen wird. Daher müssen wir nach dem Löschen des Elements den Index korrigieren, was auch der Zweck von i = i - 1; im obigen Code ist. Für weitere Interviewfragen können Sie der WeChat-Abonnementnummer Jiangjiji folgen und auf das Interview antworten, um

4. Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufen

Die Implementierung der umgekehrten Durchquerung mithilfe einer For-Schleife sieht wie folgt aus:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    für (int i = platformList.size() - 1; i >= 0; i--) {
        Zeichenfolgeelement = Plattformliste.get(i);
 
        wenn (item.equals("Nuggets")) {
            Plattformliste.entfernen(i);
        }
    }
 
    System.out.println(Plattformliste);
}

Diese Implementierung ähnelt der Verwendung einer For-Schleife zum Durchlaufen in Vorwärtsreihenfolge, die Indizes müssen jedoch nicht korrigiert werden, da die Indizes der Elemente am Anfang wie folgt lauten:

Wie Funktion: MySQL oder Redis verwenden?

Nach dem Löschen des Elements „Nuggets“ in der ersten Schleife sehen die Indizes der Elemente wie folgt aus:

Wie Funktion: MySQL oder Redis verwenden?

In der zweiten Schleife ist der Wert von i 1, was bedeutet, dass das Element "CSDN" erhalten wird, was nicht dazu führt, dass das Element übersprungen wird, sodass der Index nicht korrigiert werden muss.

Beim zweiten Abrufen des Elements sind die Werte von modCount und expectedModCount nicht gleich und daher wird der Fehler ausgelöst.
java.util.ConcurrentModificationException.

Wie Funktion: MySQL oder Redis verwenden?

Da dies mit foreach nicht erreicht werden kann, wie können wir es implementieren?

Es gibt drei Hauptmethoden:

  • Verwenden der remove()-Methode des Iterators
  • Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufen
  • Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufen

Als nächstes werde ich sie einzeln erklären.

5. Verwenden Sie die remove()-Methode des Iterators

Die Implementierung der remove()-Methode mit Iterator ist wie folgt:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    Iterator<String> iterator = Plattformliste.iterator();
    während (Iterator.hasNext()) {
        String-Plattform = Iterator.next();
        if (platform.equals("Plattform")) {
            iterator.entfernen();
        }
    }
 
    System.out.println(Plattformliste);
}

Die Ausgabe ist:

[CSDN, Nuggets]

Warum können wir iterator.remove() verwenden? Schauen wir uns den Quellcode an:

Wie Funktion: MySQL oder Redis verwenden?

Es ist ersichtlich, dass jedes Mal, wenn ein Element gelöscht wird, der Wert von modCount expectedModCount neu zugewiesen wird, sodass die beiden Variablen gleich sind und nicht ausgelöst werden
java.util.ConcurrentModificationException. Weitere Interviewfragen finden Sie im offiziellen Konto Java Interview Questions Selection

6. Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufen

Die Implementierung der Vorwärtsdurchquerung mithilfe einer For-Schleife sieht wie folgt aus:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    für (int i = 0; i < platformList.size(); i++) {
        Zeichenfolgeelement = Plattformliste.get(i);
 
        if (item.equals("Element löschen")) {
            Plattformliste.entfernen(i);
            = i - 1;
        }
    }
 
    System.out.println(Plattformliste);
}

Diese Implementierung ist relativ einfach zu verstehen, d. h. das Löschen erfolgt über den Array-Index. Es gibt jedoch einen Hinweis, dass nach dem Löschen des Elements der Indexwert korrigiert werden muss:

= i - 1;

Warum müssen wir den Wert des Index korrigieren? Denn der Index des Anfangselements sieht folgendermaßen aus:

Wie Funktion: MySQL oder Redis verwenden?

Nach dem Löschen des Elements „博客园“ in der ersten Schleife sieht der Index des Elements wie folgt aus:

Wie Funktion: MySQL oder Redis verwenden?

In der zweiten Schleife ist der Wert von i gleich 1, was bedeutet, dass das Element „Nuggets“ genommen wird, was dazu führt, dass das Element „CSDN“ übersprungen wird. Daher müssen wir nach dem Löschen des Elements den Index korrigieren, was auch der Zweck von i = i - 1; im obigen Code ist. Für weitere Interviewfragen können Sie der WeChat-Abonnementnummer Jiangjiji folgen und auf das Interview antworten, um

7. Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufen

Die Implementierung der umgekehrten Durchquerung mithilfe einer For-Schleife sieht wie folgt aus:

öffentliche statische void main(String[] args) {
    Liste<String> Plattformliste = neue ArrayList<>();
    platformList.add("Datei hinzufügen");
    platformList.add("CSDN");
    Plattformliste.add("Nuggets");
 
    für (int i = platformList.size() - 1; i >= 0; i--) {
        Zeichenfolgeelement = Plattformliste.get(i);
 
        wenn (item.equals("Nuggets")) {
            Plattformliste.entfernen(i);
        }
    }
 
    System.out.println(Plattformliste);
}

Diese Implementierung ähnelt der Verwendung einer For-Schleife zum Durchlaufen in Vorwärtsreihenfolge, die Indizes müssen jedoch nicht korrigiert werden, da die Indizes der Elemente am Anfang wie folgt lauten:

Wie Funktion: MySQL oder Redis verwenden?

Nach dem Löschen des Elements „Nuggets“ in der ersten Schleife sehen die Indizes der Elemente wie folgt aus:

Wie Funktion: MySQL oder Redis verwenden?

In der zweiten Schleife ist der Wert von i 1, was bedeutet, dass das Element "CSDN" erhalten wird, was nicht dazu führt, dass das Element übersprungen wird, sodass der Index nicht korrigiert werden muss.

Dies ist das Ende dieses Artikels darüber, ob MySQL oder Redis für die Like-Funktion verwendet werden soll. Weitere relevante MySQL/Redis-Like-Inhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Ein Beispiel für die Verwendung von Thinkphp5 zum Betreiben von Redis zur Implementierung eines Artikelpopularitäts- und Likes-Rankings
  • Detaillierter Code zur Verwendung von Redis zum Implementieren von Likes und zum Abbrechen von Likes
  • Beispielcode für die Verwendung des Redis-Cache zur Implementierung von Likes und Likes
  • Springboot + Redis implementiert die Erhöhungs- und Verringerungsvorgänge für die Anzahl von Likes, Ansichten, Favoriten, Kommentaren usw.
  • Detaillierte Erläuterung der Designideen der auf Redis basierenden Like-Funktion
  • Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Redis die Like-Funktion implementieren und mit der Datenbank synchronisieren

<<:  Kernkompetenzen, die Web-Frontend-Entwicklungsingenieure beherrschen müssen

>>:  Drei Möglichkeiten, durch Klicken auf ein Button-Tag in HTML zu einer Seite zu springen

Artikel empfehlen

Detaillierte Erklärung der MySQL-Alter-Ignore-Syntax

Als ich heute bei der Arbeit war, wurde mir von d...

JavaScript zum Erreichen eines einfachen Seiten-Countdowns

In diesem Artikelbeispiel wird der spezifische Ja...

MySQL Series 6-Benutzer und Autorisierung

Inhaltsverzeichnis Tutorial-Reihe 1. Benutzerverw...

Detaillierte Schritte zur Installation von MySQL 5.7 über YUM auf CentOS7

1. Gehen Sie zu dem Speicherort, an dem Sie das I...

Detaillierte Erläuterung der gespeicherten Prozeduren und Funktionen von MySQL

1 Gespeicherte Prozedur 1.1 Was ist eine gespeich...

Mein CSS-Framework – base.css (Browser-Standardstil zurücksetzen)

Code kopieren Der Code lautet wie folgt: @Zeichen...

Installations- und Konfigurationstutorial von MySQL 8.0.16 unter Win10

1. Entpacken Sie MySQL 8.0.16 Der Ordner dada und...

Befehl zum Anzeigen der Erstellungszeit der Binlog-Datei unter Linux

Inhaltsverzeichnis Hintergrund analysieren Verfah...

Verwenden von HTML+CSS zum Verfolgen von Mausbewegungen

Da Benutzer immer datenschutzbewusster werden und...

Detaillierte Erklärung dieser Zeigerfunktion in JS

Die Pfeilfunktion ist eine neue Funktion in ES6. ...

Detaillierte Erläuterung der Nginx-Zugriffsbeschränkungskonfiguration

Was ist die Nginx-Zugriffsbeschränkungskonfigurat...

Grundlegende Hinweise zu HTML und CSS (unbedingt für das Frontend lesen)

Als ich zum ersten Mal mit HTML in Berührung kam,...

Weitere beliebte und kreative Beispiele für Webdesign mit dunklem Hintergrund

Seitendesigns im dunklen Hintergrundstil sind seh...