Как кешировать файлы в golang?

Пользователь

от tito_walker , в категории: Общие вопросы , 5 месяцев назад

Как кешировать файлы в golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

1 ответ

Пользователь

от kailyn , 5 месяцев назад

@tito_walker 

В Go существует несколько способов кеширования файлов. Рассмотрим два из них:

  1. Использование пакета http.FileServer:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"log"
	"net/http"
)

func main() {
	fs := http.FileServer(http.Dir("static"))
	http.Handle("/", cacheMiddleware(fs))

	log.Fatal(http.ListenAndServe(":8080", nil))
}

// функция-посредник для добавления кэширования
func cacheMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// устанавливаем заголовки кэширования
		w.Header().Set("Cache-Control", "max-age=86400") // кешировать на 24 часа
		w.Header().Set("Expires", time.Now().Add(24*time.Hour).Format(http.TimeFormat))

		next.ServeHTTP(w, r)
	})
}


  1. Использование пакета github.com/patrickmn/go-cache:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package main

import (
	"log"
	"net/http"
	"time"

	"github.com/patrickmn/go-cache"
)

var c = cache.New(24*time.Hour, 10*time.Minute)

func main() {
	http.HandleFunc("/", cacheMiddleware(staticHandler))

	log.Fatal(http.ListenAndServe(":8080", nil))
}

// функция-посредник для добавления кэширования
func cacheMiddleware(next http.Handler) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// проверяем, есть ли запрашиваемый файл в кэше
		if x, found := c.Get(r.URL.String()); found {
			content := x.(string)
			w.Write([]byte(content))
			return
		}

		// получаем содержимое файла
		content, err := getFileContent(r.URL.Path)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		// добавляем содержимое файла в кэш
		c.Set(r.URL.String(), content, cache.DefaultExpiration)

		w.Write([]byte(content))
	}
}

// функция для получения содержимого файла
func getFileContent(path string) (string, error) {
	// реализация получения содержимого файла
}


Оба этих метода позволяют добавлять кэширование файлов в вашем веб-приложении на Go.