>백엔드 개발 >Golang >Golang의 웹 프레임워크를 사용하여 로컬 캐싱 구현 Buffalo 프레임워크

Golang의 웹 프레임워크를 사용하여 로컬 캐싱 구현 Buffalo 프레임워크

王林
王林원래의
2023-06-24 09:21:061188검색

로컬 캐싱은 웹 개발에서 일반적으로 사용되는 기술로, 웹 애플리케이션의 성능과 가용성을 향상시킬 수 있습니다. 개발 과정에서 로컬 캐싱을 구현하기 위해 특정 프레임워크를 사용해야 하는 경우가 종종 있습니다. 이 글에서는 Golang의 웹 프레임워크인 Buffalo 프레임워크를 사용하여 로컬 캐싱을 구현하는 방법을 소개하겠습니다.

Buffalo 프레임워크는 Golang 언어를 기반으로 개발된 웹 프레임워크입니다. Buffalo 프레임워크에서는 로컬 캐싱을 쉽게 구현할 수 있어 웹 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 아래에서는 Buffalo 프레임워크를 사용하여 로컬 캐싱을 구현하는 방법을 소개합니다.

1단계: 새 Buffalo 애플리케이션 만들기

Buffalo 프레임워크를 사용하여 로컬 캐싱을 구현하려면 먼저 새 Buffalo 애플리케이션을 만들어야 합니다. 다음 명령을 사용하여 새 Buffalo 앱을 만들 수 있습니다.

$ buffalo new myapp

그러면 myapp이라는 이름의 새 Buffalo 앱이 만들어집니다. myapp的新Buffalo应用程序。

第二步:添加gorilla / mux依赖关系

我们将使用gorilla / mux作为我们的HTTP路由器。为此,我们需要添加gorilla / mux的依赖项。我们可以通过在go.mod文件中添加以下行来实现:

require github.com/gorilla/mux v1.8.0

然后运行以下命令来下载依赖项:

$ go mod download

第三步:创建一个缓存控制器

我们需要创建一个缓存控制器来处理所有请求。我们可以创建一个名为CacheController的新文件,并添加以下代码:

package actions

import (
    "net/http"
    "time"

    "github.com/gorilla/mux"
    "github.com/gobuffalo/buffalo"
    "github.com/gobuffalo/buffalo/cache"
)

func CacheController() buffalo.Handler {
    // create a map to store the cache entries
    var cacheEntries = make(map[string]cache.Store)

    return func(c buffalo.Context) error {
        // get the current route
        route := c.Value("current_route").(mux.RouteMatch)

        // get the cache entry name
        cacheKey := route.Route.GetName()

        // check if the cache entry exists
        if cacheEntry, ok := cacheEntries[cacheKey]; ok {
            // if it does, get the value from the cache
            cachedValue, err := cacheEntry.Get(c.Request().URL.String())
            if err == nil {
                // if there's no error, return the value from the cache
                return c.Render(http.StatusOK, r.JSON(cachedValue))
            }
        }

        // if the cache entry doesn't exist or there was an error getting
        // the value from the cache, run the handler and cache the result
        h := route.Route.GetHandler()
        res := h(c)
        cacheStore := cache.NewCache(time.Minute * 1)
        cacheStore.Add(c.Request().URL.String(), res.Body.String())

        cacheEntries[cacheKey] = cacheStore

        return res
    }
}

在这个控制器中,我们使用了gorilla / mux的mux.RouteMatch结构,来获取当前的路由信息和名称。然后我们使用Buffalo的cache包来实现缓存。当我们检查缓存时,我们首先检查路由是否存在于我们的缓存map中,然后检查缓存中是否存在与请求URL的匹配项。如果存在匹配项,则返回缓存的值,否则运行处理程序并将结果缓存起来。

第四步:在路由器中使用缓存控制器

现在我们可以在路由器中使用缓存控制器了。我们只需要在路由器的中间件中添加CacheController

2단계: gorilla/mux 종속성 추가

우리는 gorilla/mux를 HTTP 라우터로 사용합니다. 이를 위해서는 gorilla/mux의 종속성을 추가해야 합니다. go.mod 파일에 다음 줄을 추가하면 됩니다.

func (a *App) cacheRoutes() {
    r := a.Router

    r.Use(func(next buffalo.Handler) buffalo.Handler {
        return func(c buffalo.Context) error {
            c.Set("start_time", time.Now())
            return next(c)
        }
    })

    r.Use(CacheController())
}

그런 다음 다음 명령을 실행하여 종속성을 다운로드합니다.

$ buffalo dev

3단계: 캐시 컨트롤러 만들기

필요합니다. 모든 요청을 처리하는 캐시 컨트롤러를 만듭니다. CacheController라는 새 파일을 만들고 다음 코드를 추가할 수 있습니다:

$ curl http://localhost:3000/api/v1/items

이 컨트롤러에서는 gorilla/mux의 mux.RouteMatch 구조를 사용하여 현재 라우팅을 얻습니다. 정보와 이름. 그런 다음 Buffalo의 cache 패키지를 사용하여 캐싱을 구현합니다. 캐시를 확인할 때 먼저 캐시 맵에 경로가 있는지 확인한 다음 요청 URL과 일치하는 항목이 캐시에 있는지 확인합니다. 일치하는 항목이 있으면 캐시된 값이 반환되고, 그렇지 않으면 핸들러가 실행되고 결과가 캐시됩니다.

4단계: 라우터에서 캐시 컨트롤러 사용

이제 라우터에서 캐시 컨트롤러를 사용할 수 있습니다. 라우터의 미들웨어에 CacheController 컨트롤러를 추가하기만 하면 됩니다. 다음 코드를 사용하여 이 프로세스를 구현할 수 있습니다. 🎜rrreee🎜 이 예에서는 요청 기간과 성능을 기록하기 위해 시작 시간 미들웨어도 추가합니다. 🎜🎜5단계: 캐시 테스트🎜🎜이제 캐시가 제대로 작동하는지 테스트할 수 있습니다. 다음 명령을 사용하여 Buffalo 애플리케이션을 시작할 수 있습니다. 🎜rrreee🎜 그런 다음 컬과 같은 도구를 사용하여 캐시를 테스트할 수 있습니다. 예: 🎜rrreee🎜 이 명령을 여러 번 실행하여 캐시를 테스트할 수 있습니다. 첫 번째 실행에서는 캐시가 채워지고 두 번째 및 후속 실행에서는 캐시된 값이 반환됩니다. 🎜🎜결론🎜🎜이 기사에서는 Buffalo 프레임워크를 사용하여 로컬 캐싱을 구현하는 방법을 소개했습니다. Buffalo 프레임워크는 많은 일반적인 작업과 작업을 단순화하므로 웹 애플리케이션 개발에 매우 ​​유용합니다. Buffalo 프레임워크와 gorilla/mux 및 Buffalo의 캐시 패키지와 같은 일부 기타 종속성을 사용하여 로컬 캐싱을 쉽게 구현하고 웹 애플리케이션의 성능과 가용성을 향상시킬 수 있습니다. 🎜

위 내용은 Golang의 웹 프레임워크를 사용하여 로컬 캐싱 구현 Buffalo 프레임워크의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.