


Cara menggunakan konteks dalam Go untuk melaksanakan muat semula automatik cache hasil permintaan
Cara menggunakan konteks dalam Pergi untuk melaksanakan penyegaran automatik cache hasil permintaan
Abstrak:
Dalam pembangunan aplikasi web, untuk meningkatkan pengalaman pengguna, kadangkala kita perlu cache hasil beberapa permintaan untuk mengurangkan akses kepada pangkalan data atau lain-lain perkhidmatan. Walau bagaimanapun, tempoh sah data cache adalah masalah Cache tamat tempoh boleh menyebabkan pengguna mendapatkan data tamat tempoh, mengakibatkan paparan dan operasi yang salah. Dalam artikel ini, kami akan meneroka cara menggunakan pakej konteks Go untuk melaksanakan fungsi muat semula automatik cache hasil permintaan untuk memastikan ketepatan masa data cache.
- Apakah pakej konteks bahasa Go menyediakan pakej konteks sebagai alat untuk memindahkan maklumat konteks antara coroutine. Jenis Konteks dalam pakej konteks menyediakan beberapa kaedah dan sifat untuk mengawal dan membatalkan pelaksanaan coroutine. Apabila memproses permintaan web, kami boleh menghantar maklumat konteks permintaan melalui pakej konteks dan mengawal pelaksanaan beberapa operasi yang berkaitan.
Melaksanakan cache hasil permintaan - Pertama, kita perlu menentukan struktur cache untuk menyimpan keputusan permintaan dan masa tamat tempohnya. Kodnya adalah seperti berikut:
type CacheItem struct { result interface{} expireAt time.Time } type Cache struct { cacheMap map[string]CacheItem mutex sync.RWMutex }
func (c *Cache) Get(key string) interface{} { c.mutex.RLock() defer c.mutex.RUnlock() item, ok := c.cacheMap[key] if ok && item.expireAt.After(time.Now()) { return item.result } // 发起请求并更新缓存 result := makeRequest(key) c.cacheMap[key] = CacheItem{result: result, expireAt: time.Now().Add(time.Minute)} return result }
- Segarkan semula cache
- Untuk memastikan ketepatan masa data cache, kami perlu memuat semula cache dengan kerap. Dalam Go, kami boleh menggunakan fungsi WithDeadline bagi pakej konteks untuk menetapkan tarikh akhir dan secara automatik membatalkan operasi yang sepadan selepas tamat masa. Kami boleh menggunakan ciri ini untuk memuat semula cache secara automatik. Kodnya adalah seperti berikut:
func (c *Cache) RefreshCache(ctx context.Context, key string) { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case <-ticker.C: result := makeRequest(key) c.mutex.Lock() c.cacheMap[key] = CacheItem{result: result, expireAt: time.Now().Add(time.Minute)} c.mutex.Unlock() case <-ctx.Done(): return } } }
- Contoh Penggunaan
- Seterusnya, kami akan menggunakan aplikasi web mudah untuk menunjukkan cara menggunakan pelaksanaan cache di atas. Kod tersebut adalah seperti berikut:
package main import ( "context" "fmt" "net/http" "sync" "time" ) type CacheItem struct { result interface{} expireAt time.Time } type Cache struct { cacheMap map[string]CacheItem mutex sync.RWMutex } func makeRequest(key string) interface{} { // 模拟请求耗时 time.Sleep(time.Second) return fmt.Sprintf("result for %s", key) } func (c *Cache) Get(key string) interface{} { c.mutex.RLock() defer c.mutex.RUnlock() item, ok := c.cacheMap[key] if ok && item.expireAt.After(time.Now()) { return item.result } result := makeRequest(key) c.cacheMap[key] = CacheItem{result: result, expireAt: time.Now().Add(time.Minute)} return result } func (c *Cache) RefreshCache(ctx context.Context, key string) { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case <-ticker.C: result := makeRequest(key) c.mutex.Lock() c.cacheMap[key] = CacheItem{result: result, expireAt: time.Now().Add(time.Minute)} c.mutex.Unlock() case <-ctx.Done(): return } } } func main() { cache := &Cache{cacheMap: make(map[string]CacheItem)} http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*5)) defer cancel() key := r.URL.Path result := cache.Get(key) fmt.Fprintf(w, "%s: %s", key, result) // 启动刷新缓存的协程 go cache.RefreshCache(ctx, key) }) http.ListenAndServe(":8080", nil) }
Artikel ini memperkenalkan cara menggunakan pakej konteks Go untuk melaksanakan fungsi muat semula automatik cache hasil permintaan. Dengan menggunakan struktur cache dan kunci mutex untuk memastikan keselamatan serentak, dan menggunakan ciri pakej konteks untuk menyegarkan semula cache secara kerap, kami hanya boleh cache hasil permintaan dan memastikan ketepatan masa data. Kod sampel di atas hanyalah demonstrasi mudah Penggunaan sebenar mungkin memerlukan pengubahsuaian dan pengoptimuman yang sesuai berdasarkan keperluan khusus.
Atas ialah kandungan terperinci Cara menggunakan konteks dalam Go untuk melaksanakan muat semula automatik cache hasil permintaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Apabila menggunakan SQL.Open, mengapa DSN tidak melaporkan ralat? Dalam bahasa Go, sql.open ...
