Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membina API RESTful menggunakan Golang dan menggunakan caching?

Bagaimana untuk membina API RESTful menggunakan Golang dan menggunakan caching?

WBOY
WBOYasal
2024-06-05 16:52:08768semak imbas

Sepadukan cache apabila membina API RESTful dengan Golang: gunakan Gin untuk mencipta API;

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

Cara untuk menyepadukan caching apabila membina API RESTful dengan Golang

Apabila membina API RESTful, caching boleh meningkatkan prestasi, mengurangkan beban pelayan dan meningkatkan pengalaman pengguna. Artikel ini akan membimbing anda membina API RESTful dan menyepadukan caching menggunakan Golang.

Buat API RESTful menggunakan Gin

Mula-mula, buat API RESTful Golang baharu menggunakan rangka kerja Gin:

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

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

Mengintegrasikan Redis Cache

Untuk menggunakan redis nilai, kami akan sangat tersedia untuk menggunakan caching. kedai . Pastikan Redis dipasang dan berjalan.

Di Golang, kita boleh menggunakan perpustakaan redigo untuk menyambung ke 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")
        },
    }
}

Lapisan Cache

Sekarang, mari tentukan lapisan baharu untuk mengurus cache. Lapisan ini akan menyediakan fungsi untuk mendapatkan, menetapkan dan memadam nilai 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
}

Menggunakan caching

Dalam fungsi pengendali Gin, kita boleh menggunakan lapisan caching untuk cache tindak balas API. Berikut ialah fungsi pengendali GetUsers yang diubah suai:

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
}

Sekarang, API akan mula-mula mendapat respons daripada cache, dan jika nilai itu tidak wujud dalam cache, ia akan mendapat data daripada pangkalan data dan menyimpannya dalam cache. Ini akan mengurangkan dengan ketara pertanyaan pangkalan data yang diminta pendua, dengan itu meningkatkan prestasi.

Atas ialah kandungan terperinci Bagaimana untuk membina API RESTful menggunakan Golang dan menggunakan caching?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn