猿问

设置每小时查询一次数据库以刷新其数据的戈兰 API

我对golang来说相对较新,可以使用一些关于如何构建它的高级提示。我正在尝试构建一个 REST API:

  • 用户将通过 POST 方法提供一个小的 JSON 有效负载

  • API 将用户的输入数据与存储为结构切片的引用数据集进行比较,并计算值

  • 此值将返回给用户

  • 每小时都会查询一个数据库,并将结构块数据集替换为另一个结构块数据集。基本上,这会刷新参考数据

  • 我希望这个令人耳目一新的工作是异步的,这样它就不会减慢用户体验

我使用的是高浪的 Echo 框架(https://echo.labstack.com/)。这是我在类似戈兰的伪代码中的尝试。您将如何构建此 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

    

    })

    

}


MMMHUHU
浏览 68回答 1
1回答

茅侃侃

对于 Go 中的异步代码,您可以使用 goroutine,要定期执行代码,可以使用股票代码。package mainimport (    "fmt"    "time"    "sync")var rwm sync.RWMutexvar 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}如果需要跨多个包进行访问,则需要将其导出并将其移动到非主包,即可以导入的包。并对 执行相同的操作。sliceOfStructsrwm确保读取的任何代码在读取之前和完成时都会调用。sliceOfStructsrwm.RLockrwm.RUnlock如果您有多个需要编写的戈鲁廷,则应从 更改为 。sliceOfStructsrwmsync.RWMutexsync.Mutex
随时随地看视频慕课网APP

相关分类

Go
我要回答