Detaillierte Erklärung zur Implementierung des sekundären Caches mit MySQL und Redis

Detaillierte Erklärung zur Implementierung des sekundären Caches mit MySQL und Redis

Redis-Einführung

Redis ist vollständig Open Source und kostenlos, entspricht dem BSD-Protokoll und ist eine leistungsstarke Schlüssel-Wert-Datenbank.

Redis und andere Key-Value-Cache-Produkte weisen die folgenden drei Merkmale auf:

  • Redis unterstützt Datenpersistenz. Es kann die Daten im Speicher auf der Festplatte speichern und beim Neustart erneut laden.
  • Redis unterstützt nicht nur einfache Schlüssel-Wert-Daten, sondern bietet auch Speicher für Listen, Sets, Zsets, Hashes und andere Datenstrukturen.
  • Redis unterstützt die Datensicherung, d. h. die Datensicherung im Master-Slave-Modus

Vorteile

  • Hohe Leistung – Redis kann 110.000 Mal/s lesen und 81.000 Mal/s schreiben
  • Umfangreiche Datentypen – Redis unterstützt Datentypoperationen für Strings, Listen, Hashes, Sets und geordnete Sets in binären Fällen.
  • Atomar – Alle Redis-Operationen sind atomar, was bedeutet, dass sie entweder erfolgreich sind oder fehlschlagen und überhaupt nicht ausgeführt werden. Einzelne Operationen sind atomar. Mehrfachoperationen unterstützen auch Transaktionen, d. h. Atomarität, indem sie in MULTI- und EXEC-Anweisungen verpackt werden

Download und Installation

Herunterladen und entpacken

wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz

Verschieben Sie den Ordner nach /usr/local/

mv redis-5.0.3 /usr/local/

Gehen Sie in den Ordner und kompilieren Sie den Test

cd /usr/local/redis-5.0.3
sudo machen test

Kompilieren und installieren

sudo make installieren

Redis starten

Redis-Server

MySQL und Redis als sekundärer Cache

Bei Daten mit einer großen Anzahl von Besuchen müssen wir die aus der Datenbank erhaltenen Daten zwischenspeichern, um die Daten schneller abzurufen.

Verwenden des Redis-Cache-Prozesses im Projekt

  • Bei der Abfrage zuerst den Cache abfragen
  • Wenn keine Daten im Cache vorhanden sind, diese aus der Datenbank abfragen und die Daten im Cache speichern
  • Werden die Daten im Cache gefunden, werden sie direkt und ohne Abfrage der Datenbank zurückgegeben.

Beim Zwischenspeichern von Daten sollten Synchronisierungsprobleme berücksichtigt werden: Wenn Daten zwischengespeichert sind und beim Abfragen von Daten Daten im Cache vorhanden sind, werden die zwischengespeicherten Daten direkt zurückgegeben, ohne dass die Datenbank abgefragt werden muss. Wenn sich die Datenbankdaten ändern, kann es zu Datenbankinkonsistenzen kommen. Sie können bei jeder Änderung der Datenbank das Löschen der entsprechenden zwischengespeicherten Daten in Betracht ziehen, sodass Sie bei einer erneuten Abfrage die Datenbank abfragen und zwischenspeichern.

Schritte zur Implementierung

Erstellen Sie die Datei redisPool.go zum Initialisieren des Verbindungspools

Paket redigo_pool

importieren (
 "Flagge"
 „github.com/garyburd/redigo/redis“
 "Zeit"
)
var (
 Pool *redis.Pool
 RedisServer = flag.String("redisServer", ":6379", "")
 
)
Funktion init() {
 Pool = &redis.Pool{
  MaxIdle: 3, // Maximale Anzahl inaktiver Links, was bedeutet, dass auch wenn keine Redis-Verbindung besteht, N inaktive Links aufrechterhalten werden können, ohne gelöscht zu werden. MaxActive: 3, // Maximale Anzahl aktiver Verbindungen, was die maximale Anzahl gleichzeitig aktiver Links angibt. IdleTimeout: 240 * time.Second, // Maximale Wartezeit für inaktive Links. Wenn diese Zeit überschritten wird, werden inaktive Links geschlossen. Dial: func() (redis.Conn, error) {
   c, err := redis.Dial("tcp", *RedisServer)
   wenn err != nil {
    returniere nil, err
   }
   returniere c, err
  },
  TestOnBorrow: func(c redis.Conn, t Zeit.Zeit) Fehler {
   if Zeit.Seit(t) < Zeit.Minute {
    Rückgabe Null
   }
   _, err := c.Do("PING")
   Rückgabefehler
  },
 }
}

Erstellen Sie die Datei main.go, um den sekundären Cache zu implementieren

Paket Haupt

importieren (
 "Datenbank/SQL"
 "Kodierung/JSON"
 "fmt"
 „github.com/garyburd/redigo/redis“
 _ "github.com/go-sql-driver/mysql"
 "strconv"
 "web/redis/redigo_pool"
 _ "web/redis/redigo_pool"
)

Typ Person Struktur {
 ID int `db:"id"`
 Name der Zeichenfolge `db:"name"`
 Alter int `db:"Alter"`
 Rmb int `db:"rmb"`
}

Funktion main() {
 var cmd Zeichenfolge
 für{
  fmt.Println("Befehl eingeben")
  fmt.Scan(&cmd)
  Schalter cmd {
  Fall "getall":
   getAll()
  Standard:
   fmt.Println("Kann andere Befehle nicht erkennen")
  }
  fmt.Println()
 }
}

Funktion getAll() {
 //Holen Sie sich die Verbindung aus dem Verbindungspool conn := redigo_pool.Pool.Get()
 //Überprüfen Sie zunächst, ob Daten in Redis vorhanden sind//conn,_ :=redis.Dial("tcp","localhost:6379")
 conn.Close() verschieben
 Werte, _ := redis.Werte(conn.Do("lrange", "mlist",0,-1))

 wenn Länge(Werte) > 0 {
  //Wenn Daten vorhanden sind, fmt.Println("Daten von Redis abrufen")
  //Direkt von Redis abrufen für _, Schlüssel := Bereichswerte{
   pid := Zeichenfolge(Schlüssel.([]Byte))
   Ich würde ,_:= strconv.Atoi(pid)
   Ergebnisse,_ := redis.Bytes(conn.Do("GET",id))
   var p Person
   err := json.Unmarshal(Ergebnisse,&p)
   wenn err != nil {
    fmt.Println("JSON-Deserialisierungsfehler")
   }anders {
    fmt.Printf("name = %s\n",p.Name)
   }
  }
 }anders {
  fmt.Println("Von MySQL abrufen")

  //Datenbank abfragen db,_ := sql.Open("mysql","root:Szt930708@tcp(localhost:3306)/mydb")
  db.Close() verschieben

  var Personen []Person

  Zeilen, _ := db.Query("Wählen Sie ID, Name, Alter, RMB aus Person aus")
  für Zeilen.Weiter() {
   var id int
   Variablenname Zeichenfolge
   var Alter int
   var rmb int
   Zeilen.Scan(&id,&name,&alter,&rmb)
   pro := Person{id,name,alter,rmb}
   Personen = anhängen(Personen,pro)

  }
  //Nach Redis schreiben: Person im Hash-Modus nach Redis schreiben für _,p := range persons{

   p_byte,_ := json.Marshal(p)
   _,err1 := conn.Do("SETNX",p.Id,p_byte)
   _,err2 := conn.Do("lpush","mlist",p.Id)
   // Ablaufzeit festlegen conn.Do("EXPIRE",p.Id,60*5)
   wenn err1 != nil || err2 != nil {
    fmt.Println("Schreiben fehlgeschlagen")
   }anders {
    fmt.Println("Erfolgreich geschrieben")
   }
  }
  conn.Do("ABLAUF","mlist",60*5)
 }
}

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • MySQL-Abfrage-Cache und Pufferpool
  • Untersuchungen zur Pufferpool-Verschmutzung durch mysqldump
  • Implementierung des LNMP-Architektur-Cache in MySQL unter einer Redis-Serverumgebung
  • Detaillierte Erläuterung der Verwendung des MySQL-Auswahl-Cache-Mechanismus
  • Detaillierte Erklärung der Abfrage- und Löschbefehle für den MySQL-Cache
  • So verwenden Sie Redis, um den Druck des MySQL-Cache in PHP zu berechnen
  • Startmethode und Parameterdetails für MySQL-Cache (query_cache_size)
  • Mögliche Methoden zum Löschen des MySQL-Abfragecaches
  • Eine kurze Analyse des Prinzips und des Caching-Prozesses der Verwendung von Memcache zum Zwischenspeichern von MySQL-Datenbankvorgängen
  • Detaillierte Erklärung des Pufferpools in MySQL

<<:  Schritte zum Erstellen des Projekts vite+vue3+element-plus

>>:  Nginx-Praxis zur Optimierung hoher Parallelität

Artikel empfehlen

Vue + node realisiert Audioaufzeichnungs- und -wiedergabefunktion

Ergebnis: Der Hauptteil besteht darin, die Codelo...

Tutorial zu HTML-Formular-Tags (2):

Dieses Tutorial stellt die Anwendung verschiedene...

Beispielcode mit SCSS in Uni-App

Aufgetroffene Fallstricke Ich habe den ganzen Nac...

Eine kurze Analyse des Unterschieds zwischen ref und toRef in Vue3

1. ref wird kopiert, die Ansicht wird aktualisier...

Detaillierte Erklärung zum schnellen Erstellen einer Blog-Website mit Docker

Inhaltsverzeichnis 1. Vorbereitung 2. Bereitstell...

Details nach dem Setzen des src des Iframes auf about:blank

Nachdem die Quelle des Iframes auf „about:blank“ g...

Bringen Sie Ihnen bei, wie Sie wartbaren JS-Code schreiben

Inhaltsverzeichnis Was ist wartbarer Code? Code-K...

Lösungen zur Verarbeitung und Reparatur historischer Linux-Images

Der ECS-Cloud-Server, der mit dem historischen Li...

HTML-Meta erklärt

Einführung Der Meta-Tag ist ein Hilfstag im HEAD-...