Heim >Backend-Entwicklung >Golang >So verwenden Sie den Kontext in Go, um die automatische Aktualisierung des Anforderungsergebnis-Cache zu implementieren
So verwenden Sie den Kontext in Go, um die automatische Aktualisierung des Anforderungsergebnis-Cache zu implementieren
Zusammenfassung:
Um bei der Entwicklung von Webanwendungen die Benutzererfahrung zu verbessern, müssen wir manchmal die Ergebnisse einiger Anforderungen zwischenspeichern, um den Zugriff auf die Datenbank oder andere zu reduzieren Dienstleistungen. Allerdings stellt die Gültigkeitsdauer zwischengespeicherter Daten ein Problem dar. Ein abgelaufener Cache kann dazu führen, dass Benutzer abgelaufene Daten erhalten, was zu fehlerhaften Anzeigen und Vorgängen führt. In diesem Artikel erfahren Sie, wie Sie das Kontextpaket von Go verwenden, um die automatische Aktualisierungsfunktion des Anforderungsergebniscaches zu implementieren und so die Aktualität der zwischengespeicherten Daten sicherzustellen.
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 }Im obigen Code verwenden wir Lesesperren, um Cache-Elemente zu lesen und die Sicherheit der Parallelität zu gewährleisten. Wenn das Cache-Element existiert und nicht abgelaufen ist, wird das Cache-Ergebnis direkt zurückgegeben; andernfalls initiieren wir eine tatsächliche Anfrage und speichern das Anfrageergebnis im Cache.
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 } } }
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) }
In diesem Artikel wird erläutert, wie Sie das Kontextpaket von Go verwenden, um die automatische Aktualisierungsfunktion des Anforderungsergebniscaches zu implementieren. Durch die Verwendung von Cache-Strukturen und Mutexes zur Gewährleistung der Parallelitätssicherheit und die Verwendung der Funktionen des Kontextpakets zur regelmäßigen Aktualisierung des Caches können wir die Anforderungsergebnisse einfach zwischenspeichern und die Aktualität der Daten sicherstellen. Der obige Beispielcode ist nur eine einfache Demonstration. Die tatsächliche Verwendung erfordert möglicherweise entsprechende Änderungen und Optimierungen basierend auf spezifischen Anforderungen.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Kontext in Go, um die automatische Aktualisierung des Anforderungsergebnis-Cache zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!