Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie Golang und Memcache, um Caching mit hoher Parallelität zu implementieren.

So verwenden Sie Golang und Memcache, um Caching mit hoher Parallelität zu implementieren.

王林
王林Original
2023-06-19 21:11:30922Durchsuche

Mit der rasanten Entwicklung von Webanwendungen ist eine hohe Parallelität zu einem immer häufiger auftretenden Problem geworden. Caching ist eine wesentliche Technologie für Entwickler, um die Leistung und Reaktionsfähigkeit von Anwendungen aufrechtzuerhalten. In diesem Artikel stellen wir vor, wie Sie Golang und Memcache verwenden, um Caching mit hoher Parallelität zu implementieren.

Was ist Memcache?

Memcache ist ein leistungsstarkes verteiltes Speicher-Cache-System, das häufig zum Zwischenspeichern von Daten in Webanwendungen verwendet wird, z. B. Datenbankabfrageergebnissen, externen API-Antworten usw. Aufgrund seiner hohen Leistung und Skalierbarkeit wird Memcache häufig in Webanwendungen verwendet, die eine große Anzahl von Lesevorgängen erfordern.

Memcache-Funktionsprinzip

Memcache arbeitet hauptsächlich im Speicher und sein Cache-Speicherplatz wird von mehreren Computern zugewiesen. Er wird normalerweise zum Zwischenspeichern verschiedener Daten verwendet, z. B. Datenbankabfrageergebnisse, API-Antworten usw. Jeder Cache-Eintrag besteht aus einem Schlüssel und einem Wert, wobei der Schlüssel die Daten identifiziert und der Wert einen beliebigen Datentyp haben kann.

Wenn eine Anwendung Daten lesen muss, fordert sie die Daten zunächst vom Memcache-Server an. Wenn der Server die Daten zwischengespeichert hat, gibt er die Daten sofort an die Anwendung zurück. Wenn der Server die Daten nicht zwischenspeichert, fragt die Anwendung die Daten aus der Datenbank oder einer anderen Quelle ab und speichert sie für die zukünftige Verwendung im Memcache. Auf diese Weise können alle nachfolgenden Anfragen die Daten direkt aus dem Cache holen, ohne sie erneut aus der Datenbank oder anderen Quellen abfragen zu müssen.

Golang und Memcache verwenden

Memcache in Golang zu verwenden ist sehr einfach. Sie können die Memcache-Bibliothek verwenden, um eine direkte Verbindung zum Memcache-Server herzustellen und eine einfache API für Lese- und Schreibvorgänge zu verwenden. Hier ist ein Beispiel mit Golang und Memcache:

package main

import (
    "log"
    "net"
    "time"

    "github.com/bradfitz/gomemcache/memcache"
)

func main() {
    // 连接到memcache服务器
    mc := memcache.New("localhost:11211")

    // 在缓存中设置值
    err := mc.Set(&memcache.Item{Key: "mykey", Value: []byte("myvalue"), Expiration: 60})
    if err != nil {
        log.Fatalf("Error setting value: %v", err)
    }

    // 从缓存中获取值
    item, err := mc.Get("mykey")
    if err == memcache.ErrCacheMiss {
        log.Printf("Key not found in cache")
    } else if err != nil {
        log.Fatalf("Error getting value: %v", err)
    } else {
        log.Printf("Value: %s", item.Value)
    }

    // 在缓存中删除值
    err = mc.Delete("mykey")
    if err != nil {
        log.Fatalf("Error deleting value: %v", err)
    }
}

Der Beispielcode verbindet sich zunächst mit dem Memcache-Server und speichert dann den Schlüssel „mykey“ und den Wert „myvalue“ im Cache und setzt dessen Speicherzeit auf 60 Sekunden. Als nächstes ruft es den Wert aus dem Cache ab und gibt ihn aus. Schließlich wird der Wert aus dem Cache entfernt.

Verwenden Sie Golang und Memcache, um Caching mit hoher Parallelität zu erreichen.

Um Caching mit hoher Parallelität zu erreichen, können wir Golangs Goroutine und die CAS-Funktion (Compare and Swap) von Memcache verwenden. CAS ist eine atomare Operation, die Cache-Aktualisierungen ermöglicht, ohne Race-Bedingungen zu verursachen.

Im folgenden Beispielcode verwenden wir Goroutine und CAS, um Hochleistungs-Cache-Updates zu erreichen:

package main

import (
    "log"
    "net"
    "sync"
    "time"

    "github.com/bradfitz/gomemcache/memcache"
)

func main() {
    // 连接到memcache服务器
    mc := memcache.New("localhost:11211")

    // 初始化缓存
    err := initCache(mc)
    if err != nil {
        log.Fatalf("Error initializing cache: %v", err)
    }

    var wg sync.WaitGroup

    // 并发查询
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            log.Printf("Fetching key %d", i)
            item, err := mc.Get("mykey")
            if err == memcache.ErrCacheMiss {
                log.Printf("Key not found in cache")
            } else if err != nil {
                log.Fatalf("Error getting value: %v", err)
            } else {
                log.Printf("Value: %s", item.Value)
            }
        }(i)
    }

    // 等待所有的查询结束
    wg.Wait()

    log.Printf("Done")
}

func initCache(mc *memcache.Client) error {
    // 为每个键值对设置一个版本号
    const key = "mykey"
    const maxVersion = 10
    for i := 0; i < maxVersion; i++ {
        item := &memcache.Item{
            Key:        key,
            Value:      []byte("myvalue"),
            Expiration: 60,
            Flags:      uint32(i), // 版本号
        }
        if err := mc.Set(item); err != nil {
            return err
        }
    }

    // 设置缓存版本号
    item := &memcache.Item{
        Key:        key,
        Value:      []byte("myvalue"),
        Expiration: 0,
        Flags:      uint32(maxVersion),
    }
    return mc.Set(item)
}

Der Beispielcode stellt zunächst eine Verbindung zum Memcache-Server her, initialisiert den Cache und legt für jedes Schlüssel-Wert-Paar eine Versionsnummer fest. Anschließend wird mithilfe einer Goroutine jedes Schlüssel-Wert-Paar gleichzeitig aus dem Cache abgerufen. Bevor die einzelnen Werte abgerufen werden, wird zunächst die aktuelle Versionsnummer abgerufen und in einer Variablen gespeichert. Anschließend ruft es den Wert aus dem Cache ab und prüft, ob die Versionsnummer mit der vor dem Abrufen identisch ist. Wenn sie gleich sind, bedeutet dies, dass der Cache nicht abgelaufen ist und der Wert direkt verwendet werden kann. Andernfalls wird der Wert erneut aus der Datenbank oder einer anderen Quelle abgerufen und im Cache gespeichert. Selbst wenn mehrere Anforderungen gleichzeitig dasselbe Schlüssel-Wert-Paar abfragen, ist auf diese Weise gewährleistet, dass nur eine Anforderung den Wert von außen erhält, während andere Anforderungen den Wert direkt aus dem Cache erhalten, um die Leistung zu verbessern.

Fazit

In diesem Artikel haben wir vorgestellt, wie man Golang und Memcache verwendet, um Caching mit hoher Parallelität zu implementieren. Wir haben Ihnen auch gezeigt, wie Sie Goroutinen und die CAS-Funktionalität von Memcache nutzen, um leistungsstarke Cache-Updates zu erreichen. Wenn Sie eine hochgradig gleichzeitige Webanwendung schreiben, ist die Verwendung von Memcache eine effektive Möglichkeit, die Anwendungsleistung zu verbessern. Memcache ist beim Schreiben von Webanwendungen in Golang unverzichtbar.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Golang und Memcache, um Caching mit hoher Parallelität zu implementieren.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn