Heim >Backend-Entwicklung >Golang >Wie erstelle ich eine RESTful-API mit Golang und verwende Caching?

Wie erstelle ich eine RESTful-API mit Golang und verwende Caching?

WBOY
WBOYOriginal
2024-06-05 16:52:08784Durchsuche

Integrieren Sie den Cache beim Erstellen von RESTful-APIs mit Golang: Verwenden Sie Gin, um APIs zu erstellen. Definieren Sie eine Cache-Ebene, um zwischengespeicherte Werte zu verwalten.

如何使用 Golang 构建 RESTful API 并使用缓存?

So integrieren Sie Caching beim Erstellen einer RESTful-API mit Golang

Beim Erstellen einer RESTful-API kann Caching die Leistung erheblich verbessern, die Serverlast reduzieren und die Benutzererfahrung verbessern. In diesem Artikel erfahren Sie, wie Sie eine RESTful-API erstellen und Caching mit Golang integrieren.

Erstellen Sie eine RESTful-API mit Gin.

Erstellen Sie zunächst eine neue Golang-RESTful-API mit dem Gin-Framework:

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/api/v1/users", GetUsers)
    r.Run()
}

Integration des Redis-Cache

Um Caching zu verwenden, verwenden wir Redis, einen hochverfügbaren Schlüsselwert speichern . Stellen Sie sicher, dass Redis installiert ist und ausgeführt wird.

In Golang können wir die Redigo-Bibliothek verwenden, um eine Verbindung zu Redis herzustellen:

import (
    "time"

    "github.com/gomodule/redigo/redis"
)

// redisPool is a global variable to manage the Redis connection pool.
var redisPool *redis.Pool

func init() {
    redisPool = &redis.Pool{
        MaxIdle:   10,
        MaxActive: 10,
        IdleTimeout: 30 * time.Second,
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "localhost:6379")
        },
    }
}

Cache-Ebene

Jetzt definieren wir eine neue Ebene für die Cache-Verwaltung. Diese Ebene stellt Funktionen zum Abrufen, Festlegen und Löschen zwischengespeicherter Werte bereit.

import (
    "time"

    "github.com/gomodule/redigo/redis"
)

type Cache struct {
    pool *redis.Pool
}

func NewCache(pool *redis.Pool) *Cache {
    return &Cache{
        pool: pool,
    }
}

func (c *Cache) Get(key string) ([]byte, error) {
    conn := c.pool.Get()
    defer conn.Close()

    return redis.Bytes(conn.Do("GET", key))
}

func (c *Cache) Set(key string, value string) error {
    conn := c.pool.Get()
    defer conn.Close()

    _, err := conn.Do("SET", key, value)
    return err
}

func (c *Cache) Delete(key string) error {
    conn := c.pool.Get()
    defer conn.Close()

    _, err := conn.Do("DEL", key)
    return err
}

Caching verwenden

In der Gin-Handler-Funktion können wir die Caching-Ebene verwenden, um die API-Antwort zwischenzuspeichern. Hier ist die geänderte GetUsers-Handler-Funktion:

func GetUsers(c *gin.Context) {
    // 获取 Redis 缓存
    key := "users"
    cachedBytes, err := cache.Get(key)
    if err != nil {
        // 缓存中没有值,从数据库中获取
        users, err := getUserFromDB()
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }

        // 将 users 序列化为 JSON 并存储在缓存中
        userJSON, err := json.Marshal(users)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }

        err = cache.Set(key, string(userJSON))
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }

        c.JSON(http.StatusOK, users)
    } else {
        // 从缓存中获取值,反序列化回 []User 类型
        var users []User
        err := json.Unmarshal(cachedBytes, &users)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }

        c.JSON(http.StatusOK, users)
    }
}

// getUserFromDB 从数据库中获取用户
func getUserFromDB() ([]User, error) {
    // 假设这是从数据库获取用户数据的模拟函数
    return []User{{ID: 1, Name: "John"}}, nil
}

Jetzt erhält die API zunächst die Antwort aus dem Cache. Wenn der Wert nicht im Cache vorhanden ist, ruft sie die Daten aus der Datenbank ab und speichert sie im Cache. Dadurch werden doppelt angeforderte Datenbankabfragen erheblich reduziert und dadurch die Leistung verbessert.

Das obige ist der detaillierte Inhalt vonWie erstelle ich eine RESTful-API mit Golang und verwende Caching?. 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