Sobes.tech
Senior

package main import ( "io" "net/http" "strconv" "time" ) // getData деректерді қайтару, бірақ кейде өзгеруі мүмкін. func getData() int { time.Sleep(time.Millisecond * 100) return 1 } func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { _, _ = io.WriteString(writer, strconv.Itoa(getData())) }) if err := http.ListenAndServe(":8080", mux); err != nil { panic(err) } }

sobes.tech AI

AI-дан жауап

Бұл Go тіліндегі HTTP-сервер кодында getData() функциясы деректерді шамамен статикалық түрде алуға имитация жасайды және аздаған кідіріс бар.

Өнімділікті жақсарту және сұрауларды өңдеу кезінде кідірістерді азайту үшін, getData() нәтижесін кэштеуді жүзеге асырып, оны асинхронды түрде белгілі бір интервалмен жаңартуға болады.

Горутина және атомды кэш қолдану арқылы жақсартудың мысалы:

package main

import (
	"io"
	"net/http"
	"strconv"
	"sync/atomic"
	"time"
)

var cachedData atomic.Value

func refreshData() {
	for {
		data := getData()
		cachedData.Store(data)
		time.Sleep(time.Second) // әр секунд сайын жаңарту
	}
}

func getData() int {
	time.Sleep(time.Millisecond * 100) // кідіріс имитациясы
	return 1
}

func main() {
	cachedData.Store(0) // инициализация
	go refreshData()

	mux := http.NewServeMux()
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		data := cachedData.Load().(int)
		_, _ = io.WriteString(w, strconv.Itoa(data))
	})

	if err := http.ListenAndServe(":8080", mux); err != nil {
		panic(err)
	}
}

Мұндай тәсіл:

  • Әр сұрауды өңдеуде блоктау мен кідірістерді болдырмайды.
  • Деректерді фондық режимде қажетті жиілікпен жаңартады.
  • Клиенттерге кэштеуден алынған деректерді тез жеткізеді.

Егер деректер сирек өзгерсе, жаңарту интервалын ұлғайтып, жүктемені азайтуға болады.