Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Panduan Permulaan: Analisis komprehensif teknologi caching di Golang.

Panduan Permulaan: Analisis komprehensif teknologi caching di Golang.

王林
王林asal
2023-06-19 18:33:111770semak imbas

Golang ialah bahasa pengaturcaraan yang sangat popular sejak beberapa tahun kebelakangan ini, ia popular kerana prestasi konkurensi yang berkuasa dan sintaks yang ringkas. Di Golang, teknologi caching adalah komponen yang sangat penting. Caching boleh membantu kami memendekkan masa tindak balas dan meningkatkan prestasi sistem Artikel ini akan menyediakan analisis komprehensif teknologi caching di Golang untuk membantu pemula lebih memahami dan menggunakan teknologi caching.

1. Apakah itu cache?

Cache ialah kaedah penyimpanan data tambahan yang digunakan untuk mempercepatkan akses kepada data dan meningkatkan prestasi sistem. Intipati caching adalah untuk mengimbangi kelajuan akses dan ruang storan Beberapa data yang biasa digunakan boleh disimpan dalam cache untuk mempercepatkan akses. Dalam aplikasi web, kelajuan pengkomputeran pelayan secara amnya lebih cepat daripada kelajuan membaca cakera keras Menyimpan data dalam memori boleh meningkatkan kelajuan tindak balas.

2. Cache dalam Golang

Di Golang, terdapat dua kaedah caching biasa: cache memori dan cache teragih. Setiap satu akan diperkenalkan secara terperinci di bawah.

  1. Cache Memori

Cache memori menyimpan data dalam memori komputer untuk mempercepatkan capaian data. Di Golang, cache memori biasanya dilaksanakan menggunakan peta atau kepingan.

Gunakan peta untuk melaksanakan cache memori:

package main

import (
    "fmt"
    "time"
)

func main() {
    cache := make(map[string]string)
    cache["key1"] = "value1"
    cache["key2"] = "value2"
    
    // 读缓存
    cacheValue, ok := cache["key1"]
    if ok {
        fmt.Println("cache hit:", cacheValue)
    } else {
        fmt.Println("cache miss")
    }
    
    // 延迟1秒后写入新的缓存
    time.Sleep(1 * time.Second)
    cache["key3"] = "value3"
}

Dalam kod di atas, kami menggunakan fungsi make untuk mencipta pembolehubah jenis peta jenis rentetan cache dan menambah dua pasangan nilai kunci . Apabila membaca cache, kami mula-mula mendapatkan sama ada nilai cache wujud melalui pembolehubah ok, dan jika ia wujud, cetak kandungan cache. Akhir sekali, selepas mensimulasikan kelewatan 1 saat melalui fungsi time.Sleep, kami menambah pasangan nilai kunci baharu pada cache.

Gunakan slice untuk melaksanakan cache memori:

package main

import (
    "fmt"
    "time"
)

type CacheItem struct {
    Key string
    Value string
}

func main() {
    cache := []CacheItem{
        {Key: "key1", Value: "value1"},
        {Key: "key2", Value: "value2"},
    }
    
    // 读缓存
    cacheValue, ok := findCacheItemByKey(cache, "key1")
    if ok {
        fmt.Println("cache hit:", cacheValue.Value)
    } else {
        fmt.Println("cache miss")
    }
    
    // 延迟1秒后写入新的缓存
    time.Sleep(1 * time.Second)
    cache = append(cache, CacheItem{Key: "key3", Value: "value3"})
}

func findCacheItemByKey(cache []CacheItem, key string) (CacheItem, bool) {
    for _, item := range cache {
        if item.Key == key {
            return item, true
        }
    }
    return CacheItem{}, false
}

Dalam kod di atas, kami mencipta struktur CacheItem untuk mewakili setiap elemen dalam cache, dan kemudian gunakan slice untuk menyimpan berbilang CacheItem Struktur. Apabila membaca cache, kami memanggil fungsi findCacheItemByKey untuk mencari elemen dalam cache. Akhir sekali, selepas mensimulasikan kelewatan 1 saat melalui fungsi time.Sleep, kami menambah elemen CacheItem baharu pada cache.

Dalam cache memori, kita perlu memberi perhatian kepada kapasiti cache dan masa tamat tempoh cache. Jika kapasiti cache terlalu kecil, ia akan menyebabkan kegagalan cache dengan mudah dan meningkatkan bilangan akses pangkalan data. Jika masa tamat cache ditetapkan secara tidak betul, ia juga akan menyebabkan kadar hit cache berkurangan, sekali gus menjejaskan prestasi sistem.

  1. Cache Teragih

Cache teragih menyimpan data dalam ingatan berbilang komputer untuk mempercepatkan bacaan data. Di Golang, cache edaran biasa termasuk Memcached dan Redis.

Gunakan Memcached sebagai cache teragih:

package main

import (
    "fmt"
    "time"

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

func main() {
    mc := memcache.New("127.0.0.1:11211")
    mc.Set(&memcache.Item{Key: "key1", Value: []byte("value1")})
    mc.Set(&memcache.Item{Key: "key2", Value: []byte("value2")})

    // 读缓存
    cacheValue, err := mc.Get("key1")
    if err == nil {
        fmt.Println("cache hit:", string(cacheValue.Value))
    } else {
        fmt.Println("cache miss")
    }

    // 延迟1秒后写入新的缓存
    time.Sleep(1 * time.Second)
    mc.Set(&memcache.Item{Key: "key3", Value: []byte("value3")})
}

Dalam kod di atas, kami mula-mula membuat instantiate klien Memcached melalui pakej gomemcache/memcache dan menambah dua pasangan nilai kunci padanya. Apabila membaca cache, kami memanggil fungsi Get untuk mendapatkan nilai cache. Akhir sekali, selepas mensimulasikan kelewatan 1 saat melalui fungsi time.Sleep, kami menambah pasangan nilai kunci baharu pada cache.

Gunakan Redis sebagai cache teragih:

package main

import (
    "fmt"
    "time"

    "github.com/go-redis/redis"
)

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })
    defer rdb.Close()

    rdb.Set("key1", "value1", 0)
    rdb.Set("key2", "value2", 0)

    // 读缓存
    cacheValue, err := rdb.Get("key1").Result()
    if err == nil {
        fmt.Println("cache hit:", cacheValue)
    } else {
        fmt.Println("cache miss")
    }

    // 延迟1秒后写入新的缓存
    time.Sleep(1 * time.Second)
    rdb.Set("key3", "value3", 0)
}

Dalam kod di atas, kami mula-mula membuat instantiate klien Redis melalui pakej go-redis/redis dan menambah dua pasangan nilai kunci padanya. Apabila membaca cache, kami memanggil fungsi Get untuk mendapatkan nilai cache. Akhir sekali, selepas mensimulasikan kelewatan 1 saat melalui fungsi time.Sleep, kami menambah pasangan nilai kunci baharu pada cache.

3. Senario aplikasi cache

Senario aplikasi cache biasa termasuk:

  1. Caching pertanyaan pangkalan data. Jika terdapat sejumlah besar permintaan pertanyaan yang sama dalam sistem, hasil pertanyaan boleh dicache untuk meningkatkan kelajuan akses pangkalan data.
  2. Caching permintaan rangkaian. Jika terdapat sejumlah besar permintaan rangkaian yang sama dalam sistem, hasil permintaan boleh dicache untuk meningkatkan kelajuan akses rangkaian.
  3. Caching halaman. Jika terdapat sejumlah besar permintaan untuk halaman yang sama dalam sistem, halaman tersebut boleh dicache untuk meningkatkan kelajuan tindak balas halaman.
  4. Cache sumber statik. Jika terdapat sejumlah besar permintaan untuk sumber statik dalam sistem, seperti gambar, fail CSS, dsb., sumber ini boleh dicache untuk meningkatkan kelajuan akses tapak web.

4 Ringkasan

Artikel ini menyediakan analisis komprehensif teknologi caching di Golang, memperkenalkan dua bentuk caching biasa, cache memori dan cache yang diedarkan, dan memberikan contoh cara untuk Kedua-dua cache. digunakan di Golang. Di samping itu, artikel ini juga memperkenalkan senario aplikasi caching secara terperinci, dengan harapan dapat membantu pemula lebih memahami dan menggunakan teknologi caching serta meningkatkan prestasi sistem.

Atas ialah kandungan terperinci Panduan Permulaan: Analisis komprehensif teknologi caching di Golang.. 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