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

So implementieren Sie mehrere Parameter in el-dropdown in ElementUI

Aufgrund der zunehmenden Anzahl von Schaltflächen...

Lösung für das Problem, dass Docker-Protokolle nicht abgerufen werden können

Als ich den Dienst täglich überprüfte und mir die...

Detaillierte Erklärung zur Verwendung von Vue-Mixin

Inhaltsverzeichnis Verwendung von Vue-Mixin Daten...

Detaillierte Einführung in CSS-Schrift-, Text- und Listeneigenschaften

1. Schrifteigenschaften Farbe, gibt die Farbe des...

CSS löst das Fehlausrichtungsproblem von Inline-Blöcken

Schluss mit Unsinn, Postleitzahl HTML-Teil <di...

Analyse der Unterschiede zwischen Mysql InnoDB und MyISAM

MySQL unterstützt viele Arten von Tabellen (d. h....

mysql installer web community 5.7.21.0.msi grafik-tutorial zur installation

In diesem Artikelbeispiel wird der spezifische Co...

So verwenden Sie Elemente in React-Projekten

Dies ist mein erstes Mal, dass ich das Element-Fr...

Detaillierte Analyse der Replikation in MySQL

1.MySQL-Replikationskonzept Dies bedeutet, dass d...

Lösen Sie das Problem des IDEA-Konfigurations-Tomcat-Startfehlers

Beim Konfigurieren unterschiedlicher Servlet-Pfad...