Maison  >  Article  >  développement back-end  >  Comment créer une API RESTful à l'aide de Golang et utiliser la mise en cache ?

Comment créer une API RESTful à l'aide de Golang et utiliser la mise en cache ?

WBOY
WBOYoriginal
2024-06-05 16:52:08698parcourir

Intégrez la mise en cache lors de la création d'API RESTful avec Golang : utilisez Gin pour créer des API ; intégrez le cache Redis ; définissez une couche de cache pour gérer les valeurs mises en cache ; utilisez la couche de cache dans les gestionnaires Gin pour obtenir et définir les données de Redis.

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

Comment intégrer la mise en cache lors de la création d'une API RESTful avec Golang

Lors de la création d'une API RESTful, la mise en cache peut considérablement améliorer les performances, réduire la charge du serveur et améliorer l'expérience utilisateur. Cet article vous guidera pour créer une API RESTful et intégrer la mise en cache à l'aide de Golang.

Créez une API RESTful à l'aide de Gin

Tout d'abord, créez une nouvelle API Golang RESTful à l'aide du framework Gin :

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

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

Intégration du cache Redis

Pour utiliser la mise en cache, nous utiliserons Redis, une valeur-clé hautement disponible magasin . Assurez-vous que Redis est installé et en cours d'exécution.

Dans Golang, nous pouvons utiliser la bibliothèque redigo pour nous connecter à Redis :

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 Layer

Maintenant, définissons une nouvelle couche pour gérer le cache. Cette couche fournira des fonctions pour obtenir, définir et supprimer les valeurs mises en cache.

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
}

Utilisation de la mise en cache

Dans la fonction de gestionnaire Gin, nous pouvons utiliser la couche de mise en cache pour mettre en cache la réponse de l'API. Voici la fonction de gestionnaire GetUsers modifiée :

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
}

Désormais, l'API obtiendra d'abord la réponse du cache, et si la valeur n'existe pas dans le cache, elle obtiendra les données de la base de données et les stockera dans le cache. Cela réduira considérablement les requêtes de base de données demandées en double, améliorant ainsi les performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn