首页 > 解决方案 > 设置一个每小时查询一次数据库以刷新其数据的 golang API

问题描述

我对 golang 比较陌生,可以使用一些关于如何构建它的高级技巧。我正在尝试构建一个 REST API:

我正在使用 golang 的 Echo 框架(https://echo.labstack.com/)。这是我在类似 golang 的伪代码中的尝试。您将如何构建此 API 以每小时异步刷新数据?

为了澄清,我坚持的部分是“在后台每小时异步查询数据库”位。我不确定在那种情况下如何做到这一点。

func main() {

    e := echo.New()
    e.POST("/", func(something) {
        
        // This func queries the DB and saves reference dataset result as a slice of structs
        dataset := refreshDB() 

        // Does some calculations on input JSON data and reference dataset
        result := doCalcs(inputJSON, dataset)

        // Prep response in neat JSON
        responseForUser := prepOutput(result)

        return responseForUser
    
    })
    
}

标签: restgoasynchronous

解决方案


对于 Go 中的异步代码,您可以使用goroutine,要定期执行代码,您可以使用ticker

package main

import (
    "fmt"
    "time"
    "sync"
)

var rwm sync.RWMutex
var sliceOfStructs []struct{/* ... */}

func main() {
    go func() {
        tick := time.NewTicker(time.Hour)
        for range tick.C {
            rwm.Lock()
            sliceOfStructs = []struct{}{ /* refresh with new data */ }
            rwm.Unlock()
        }
    }()
    
    // start server
}
  • 如果sliceOfStructs需要跨多个包访问,那么您需要将其导出并将其移动到非主包,即可以导入的包。并为rwm.
  • 确保读取的任何代码在读取之前和完成时都会sliceOfStructs调用。rwm.RLockrwm.RUnlock
  • 如果您有多个 goroutine 需要编写,sliceOfStructs那么您应该rwm从更改sync.RWMutexsync.Mutex.

推荐阅读